This question already has answers here:
Why does a shift by 0 truncate the decimal?
                            
                                (5个答案)
                            
                    
                在4个月前关闭。
        

    

当您有一个浮点数,例如10.1,并且在JavaScript中使用零填充左移运算符(<
这是一些显示我意思的源代码:



var num1 = 958.51243

console.log(num1) // 958.51243
console.log(num1 << 0) // 958		





为什么会这样?

最佳答案

请参见docs


  所有的按位运算符的操作数均以二进制补码格式转换为带符号的32位整数,但零填充右移会导致无符号的32位整数。


因此,在执行该操作之前,这些数字将转换为整数。

对于左移,在官方规范here中进行了描述:


  6.1.6.1.9 Number :: leftShift(x,y)
  
  
  让lnum成为! ToInt32(x)。
  让rnum成为! ToUint32(y)。
  (...执行操作...)
  


ToInt32的作用:


  抽象操作ToInt32将参数转换为-2 ^ 31至2 ^ 31-1(含)范围内的2 ^ 32整数值之一。

09-27 19:07