前端保留3位小数不四舍五入_Javascript小技巧,去掉小数位并且不会四舍五入

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

如上代码,就是这么简单

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

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

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://按位或or28:{29: n = 52.123456;30: var n5 = n | 0;31: //alert(typeof n5);32: alert(n5);33:}34://按位异或xor35:{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.CallToInt32(Result(2)).

6.CallToUint32(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.5ToInt32: (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

搜代斯呐,春节快乐~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值