Javascript 为什么Math.round(-0.2)返回-0?

Javascript 为什么Math.round(-0.2)返回-0?,javascript,Javascript,我今天对Javascript有点小问题: 我有一组值,例如: US 11.3123 Brazil -0.2291 UK 0.4501 我希望显示不带小数点的舍入值,因此它将显示为: US 11 Brazil -0 UK 0 所以,问题是巴西显示的是“-0”而不是“0” 嗯,我可以轻松解决: html += '<tr><td>' + arr[i].Country + '</td&g

我今天对Javascript有点小问题:

我有一组值,例如:

US         11.3123
Brazil     -0.2291
UK          0.4501
我希望显示不带小数点的舍入值,因此它将显示为:

US         11
Brazil     -0
UK          0
所以,问题是巴西显示的是“-0”而不是“0”

嗯,我可以轻松解决:

html += '<tr><td>' + arr[i].Country + '</td>' +
            '<td>' + d3.format(arr[i].Value || 0, 0) + '</td></tr>';

从ecmascript定义中:

附注2 Math.round(x)的值与 数学地板(x+0.5),x为−0或小于0但大于0 小于或等于-0.5;对于这些情况,Math.round(x)返回−0,但是 floor(x+0.5)返回+0

问题是巴西显示的是“-0”而不是“0”

它绝不能。虽然@JoeFrambach和@Amdan解释了这一点以及为什么JS会区分+0和-0,但这不能从代码中输出(除非JS引擎有缺陷)。引用:

二,。如果[号码]为
+0
−0,返回字符串
“0”

无减号:

Math.round(-0.2) + '' == "0"
Math.round( 0.2) + '' == "0"

我仍然不需要将+0与-0区分开来。@AndréFigueiredo我不明白为什么,但这里有另一个wtf:
-0==0=>true
。但是,
1/(-0)==1/0=>false
@AndréFigueiredo:基本上,它涉及到限制。例如,当您计算
lim[x->Infinity](1/x)
时,如果您从正面接近它,结果是
+0
,但是如果您从反面接近它,结果是
-0
。考虑到所有浮点运算都涉及舍入,了解某个值是从左还是从右舍入到零是很有帮助的(即,如果您得到的
0
实际上是
0.000000000000012
还是
-0.000000000000012
)。但无论出于何种目的,它们都是相同的数字;然而,
-Infinity
1/(-0)
)和
+Infinity
1/0
)并非如此。也许值得一提的是,
-0
只有在JavaScript中,当你在
x的地方做某事时,才真正重要→0与
x不同→-0
(例如arctan),因为在所有其他情况下,它将被视为与
+0
相同。实际上,我使用的是D3的格式编号函数。我不记得当我写问题时,错过了这个重要的信息。你说得对!D3正在传输JS行为,并输出数字。。但是,我仍然有这种怀疑,因为我在控制台里玩控制台输出又是另一回事,它不做简单的字符串化
-0
是一种表示形式,当复制粘贴为文字时,它的行为与实际结果值负零一样。是的,通过查看负零的极限可以检测负零,例如,
var x=-0;1/x==-无穷大;//正确
。如果您想安全地摆脱它,将
+0
添加到
-0
将得到
+0
,或者您可以使用
x | | 0
,因为
-0
是错误的。
If x is NaN, the result is NaN.
If x is +0, the result is +0.
If x is −0, the result is −0.
If x is +∞, the result is +∞.
If x is −∞, the result is −∞.
If x is greater than 0 but less than 0.5, the result is +0.
If x is less than 0 but greater than or equal to -0.5, the result is −0.
Math.round(-0.2) + '' == "0"
Math.round( 0.2) + '' == "0"