Javascript 为什么Math.round(-0.2)返回-0?
我今天对Javascript有点小问题: 我有一组值,例如: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
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"