在测试时,我注意到Math.round()
有些奇怪。
当我将负数近似为0
(-0.1
,-0.01
等)时,我的控制台中的返回值将为-0
而非{{1 }}。更奇怪的是,如果我要将相同的值设置为元素的文本,则元素将显示0
,而不是0
。
样本: http://jsfiddle.net/dirtyd77/qcug9/
任何人都能解释为什么会这样吗?任何帮助将不胜感激!
此外,我正在使用 Chrome版本33.0.1750.117 。
答案 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==-0
和0===-0
)。
如果您不想查看Math.abs(Math.round(x))
,可以执行-0
解决方法。
答案 2 :(得分:1)
IEEE双精度格式允许负零(与正0不同)。这些值被认为几乎相等(例如,即使您与===
进行比较,它们也是相等的,并且-0
不被视为“小于”0
),但例如1/0
是infinity
1/-0
为-infinity
。
IMO你不应该试着过多地阅读这种语义。