为什么舍入-0.1会返回-0

时间:2014-03-03 17:16:59

标签: javascript

在测试时,我注意到Math.round()有些奇怪。

当我将负数近似为0-0.1-0.01等)时,我的控制台中的返回值将为-0而非{{1 }}。更奇怪的是,如果我要将相同的值设置为元素的文本,则元素将显示0,而不是0

样本: http://jsfiddle.net/dirtyd77/qcug9/

enter image description here

任何人都能解释为什么会这样吗?任何帮助将不胜感激!

此外,我正在使用 Chrome版本33.0.1750.117

3 个答案:

答案 0 :(得分:3)

JavaScript使用的数字类型(IEEE-754双精度浮点数)具有“正”和“负”零的概念。

-0.1的下一个最高整数是-0。在这种情况下,“最高”意味着“朝向正无穷大。”

来自the specification, §15.8.2.15 "Math.round"

  

如果x小于0但大于或等于-0.5,则结果为−0

转换为字符串时,

-0+0 呈现仅为0。例如:

console.log(-0)         // 0 or -0 depending on what console you use
console.log(String(-0)) // 0 (always)

答案 1 :(得分:1)

JavaScript使用IEEE-754 to represent numbers,该规范认为0-0在技术上有所不同。据推测,负零是最接近这些值的整数,由Math.round(x)定义。

请注意,零宽松且严格地等于负零(0==-00===-0)。

如果您不想查看Math.abs(Math.round(x)),可以执行-0解决方法。

答案 2 :(得分:1)

IEEE双精度格式允许负零(与正0不同)。这些值被认为几乎相等(例如,即使您与===进行比较,它们也是相等的,并且-0不被视为“小于”0),但例如1/0infinity 1/-0-infinity

IMO你不应该试着过多地阅读这种语义。