博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript小技巧,去掉小数位并且不会四舍五入
阅读量:6968 次
发布时间:2019-06-27

本文共 2435 字,大约阅读时间需要 8 分钟。

1:  var n3 = 52.3685;
2:  document.writeln(n3 >> 0);// 52
3:  可以去掉小数。

如上代码,就是这么简单

右移位操作导致小数部分丢失,为何会这样呢?左移位可以吗?移位操作是否都有如此功能呢?

带着疑问又写了一段代码用来测试以上想法,继续上代码

1:  {
2:      n = 52.123456;
3:      //alert(typeof n);
4:      alert(n);
5:  }
6:  //有符号右移
7:  {
8:      n = 52.123456;
9:      var n2 = n >> 0;
10:      //alert(typeof n2);
11:      alert(n2);
12:  }
13:  //无符号右移
14:  {
15:      n = 52.123456;
16:      var n3 = n >>> 0;
17:      //alert(typeof n3);
18:      alert(n3);
19:  }
20:  //左移0位
21:  {
22:      n = 52.123456;
23:      var n4 = n << 0;
24:      //alert(typeof n4);
25:      alert(n4);
26:  }
27:  //按位或or
28:  {
29:      n = 52.123456;
30:      var n5 = n | 0;
31:      //alert(typeof n5);
32:      alert(n5);
33:  }
34:  //按位异或xor
35:  {
36:      n = 52.123456;
37:      var n6 = n ^ 0;
38:      //alert(typeof n6);
39:      alert(n6);
40:  }

那,这里不卖关子,直接给出测试结果来:以上五种方法均可以去掉小数点;然而为什么会这样呢?

翻翻EAMCScript规范吧,或许里边会有答案,见

 

11.7.1 The Left Shift Operator (<< )

Performs a bitwise left shift operation on the left operand by the amount specified by the right operand.

The production ShiftExpression : ShiftExpression << AdditiveExpression is evaluated as follows:

1. Evaluate ShiftExpression.

2.Call (Result(1)).

3.Evaluate AdditiveExpression.

4. Call (Result(3)).

5.Call (Result(2)).

6.Call (Result(4)).

7.Mask out all but the least significant 5 bits of Result(6), that is, compute Result(6) & 0x1F.

8.Left shift Result(5) by Result(7) bits. The result is a signed 32 bit integer.

9.Return Result(8).|

再来看看那锅ToInt32干了什么,重点在第三步

ToInt32: (Signed 32 Bit Integer)

The operator ToInt32 converts its argument to one of 232 integer values in the range -231 through 231-1, inclusive. This operator functions as follows:

1. Call on the input argument.

2. If Result(1) is NaN, +0, -0, +∞, or -∞, return +0.

3. Compute sign(Result(1)) * floor(abs(Result(1))).

4. Compute Result(3) modulo 232 ; that is, a finite integer value k of Number type with positive sign and less than 232 in magnitude such the mathematical difference of Result(3) and k is mathematically an integer multiple of 232 .

5. If Result(4) is greater than or equal to 231 , return Result(4)-232 , otherwise return Result(4).

 

最后来看那个floor是什么意思,这里重点看第三步的后半拉,就是那个floor是干什么滴

floor(x) = x-(x modulo 1)

看见没,就在这一步把小数干掉了

Floor(x) 等于x减去x模上1

N= 52.123456 – 52.123456%1

=52.123456-0.1234559999999

=52

 

搜代斯呐,春节快乐~

 

 
 
 

转载于:https://www.cnblogs.com/kkun/archive/2012/01/30/2332309.html

你可能感兴趣的文章
Win8 快捷键
查看>>
将Java程序变成可执行文件的一个简单方法
查看>>
Elasticsearch学习总结(02-28 - 03-04)
查看>>
android页面跳转
查看>>
Java内存模型之happens-before
查看>>
LVM逻辑卷轴管理和磁盘配额实验
查看>>
ASP.Net定时任务执行
查看>>
keepalived+nginx负载均衡+ApacheWeb实现高可用
查看>>
约瑟夫环形链表问题、丢手帕问题、剑指offer圆圈中最后一个数问题
查看>>
企业应用平台移动化发展趋势
查看>>
微服务系列(七):将单体应用改造为微服务
查看>>
redis集群部署步骤
查看>>
Centos 配置
查看>>
eclipse svn提交忽略文件及文件夹,ignore设置无效..
查看>>
Supervisor重新加载配置启动新的进程
查看>>
promise
查看>>
es6学习1: 模拟react Comopnent类的实现
查看>>
js继承问题
查看>>
201621123069 《Java程序设计》第十一周学习总结
查看>>
配置telnet和SSH
查看>>