Javascript小技巧,去掉小数位并且不会四舍五入
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规范吧,或许里边会有答案,见http://bclary.com/2004/11/07/#a-9.5
先来看看位操作都做了什么,下边是位操作的实现步骤,重点在第五,第六步
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 GetValue(Result(1)).
3.Evaluate AdditiveExpression.
4. Call GetValue(Result(3)).
5.Call ToInt32(Result(2)).
6.Call ToUint32(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干了什么,重点在第三步
9.5 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 ToNumber 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
搜代斯呐,春节快乐~
------------------------------------------
除非特别声明,文章均为原创,版权与博客园共有,转载请保留出处
BUY ME COFFEE