84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
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
写得快!