In js wurde in der Vergangenheit die Math.floor-Methode zum Abrunden verwendet: ODER-Verknüpfung: Intervall = Intervall |. Warum können wir auf diese Weise abrunden? Bodenvergleich, was sind die Vorteile?
认证高级PHP讲师
注意,| 不是逻辑或,而是按位或 (OR)。
|
一些小区别。比如 Math.floor(NaN) 还是返回 NaN。但 NaN | 0 返回 0。再比如 Math.floor(Infinity) 返回 Infinity,但 Infinity | 0 返回 0
Math.floor(NaN)
NaN
NaN | 0
Math.floor(Infinity)
Infinity
Infinity | 0
你还可以这样 interval = interval >> 0
interval = interval >> 0
首先楼上S1ngS1ng说那些小区别是对的。
另外,|是位或运算,由于0在内存中存储的时候,是所有的整数位全部被填充了0,所以按二进制位和一个数值进行或运算,对应位上无论是0还是1和0进行或运算,都会得到它本身,但是由于数字0在内存中不存在小数部分,所以位或运算之后interval的小数部分被丢弃。其实是通过丢弃小数部分实现了向下取整。
0
1
interval
由于是位运算,所以会比Math.floor()快。
Math.floor()
真实的原因是:js内部的类型自动转换。
js的数值都是以64位浮点型表示的。当一个数值需要进行位运算时,js会自动将它转换为32位有符号整形,并舍弃小数部分。
64位
位运算
32位有符号
n|0 ; n>>0 ; //后面的0 仅用于保证n的整数值不变而已。
从64位降到32位,是会有精度损失的。小心!,最大有效范围: 2^32/2-1
小心!
> f64=(Math.pow( 2,32)/2-1)-0.5 2147483646.5 > f64|0 2147483646 > f64>>0 2147483646 > (f64 + 2)|0 //超出有效范围 -2147483648 > (f64 + 2)>>0 //超出有效范围 -2147483648 > Math.floor(f64 + 2) //正确 2147483648
两种都可以实现, interval = interval | 0 这个是一个写作的技巧,看个人爱好吧。可能就是interval = interval | 0这种写法运行会快一点,写代码这个也肯定比Math.floor写得快!
interval = interval | 0
Math.floor
注意,
|
不是逻辑或,而是按位或 (OR)。一些小区别。比如
Math.floor(NaN)
还是返回NaN
。但NaN | 0
返回 0。再比如
Math.floor(Infinity)
返回Infinity
,但Infinity | 0
返回 0你还可以这样
interval = interval >> 0
首先楼上S1ngS1ng说那些小区别是对的。
另外,
|
是位或运算,由于0
在内存中存储的时候,是所有的整数位全部被填充了0,所以按二进制位和一个数值进行或运算,对应位上无论是0
还是1
和0
进行或运算,都会得到它本身,但是由于数字0在内存中不存在小数部分,所以位或运算之后interval
的小数部分被丢弃。其实是通过丢弃小数部分实现了向下取整。由于是位运算,所以会比
Math.floor()
快。真实的原因是:js内部的类型自动转换。
js的数值都是以
64位
浮点型表示的。当一个数值需要进行位运算
时,js会自动将它转换为32位有符号
整形,并舍弃小数部分。n|0 ; n>>0 ; //后面的0 仅用于保证n的整数值不变而已。
从64位降到32位,是会有精度损失的。
小心!
,最大有效范围: 2^32/2-1两种都可以实现,
interval = interval | 0
这个是一个写作的技巧,看个人爱好吧。可能就是interval = interval | 0
这种写法运行会快一点,写代码这个也肯定比Math.floor
写得快!