2015-10-19 169 views
4

我只是想在范围<-1,1>产生随机整数,即-1,0或1。我觉得这码钉它:-0?什么是-0?

Math.round(Math.random()*2-1) 

但我发现了一个相隔更多的价值为-1, 0和1。我不知道那是什么应该是:

image description

现在,我不认为这是实现错误,但如果是,我使用的是Firefox 41和同样的事情发生在Google Chrome 39中。当我尝试在控制台中登录-0时,它显示为-0-0转换为String显示为"0"。它是什么?我可以用它来做些什么,比如一些很酷的编程黑客和变通办法吗?如果我不忽略它,它会导致一些错误吗?

+2

https://en.wikipedia.org/wiki/Signed_zero – zerkms

+2

相关[是+0和-0相同?(http://stackoverflow.com/q/7223359/218196) –

+0

重要的是要注意'-0 === 0'返回true,所以它不是你必须担心的。如果你想将-0转换为0,只需写'myvar = myvar || 0;'或者对它进行任何操作。 '(-0).toString()'也返回'“0”' –

回答

5

两个零

因为JavaScript的数量保持大小和符号分开,每一个非负数有负,包括0 这样做的原因是,只要你代表了一些数字,它可以变得如此小它与0无法区分,因为编码不够精确,无法表示差异。然后,一个有符号的零可以让你记录“从哪个方向”你接近零;也就是说,这个数字在它被认为是零之前有什么标志。

here


更多的技术的东西,如果你有兴趣。

-0和+0的实现在1985年由IEEE作为IEEE 754 standard的一部分引入。在多种浮点实现中发现的标准为many problems,这使得它们难以可靠和便携地使用。

该标准定义

  • 算术格式:套二进制和十进制浮点数据,其由有限数量(包括符号的零和次正规数),无穷大的,和特殊的“非数字“值(NaN)
  • 交换格式:可用于以高效和紧凑形式交换浮点数据的编码(位串)
  • 舍入规则:在算术和转换期间舍入数字时要满足的属性
  • 操作:算术和其他操作上算术格式 异常处理:异常情况的指示(例如,被零除,溢出等)
2

功能Math.round作品如the standard指定:

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

Math.random仅返回0(零)和1(1)之间的数字,因此您将有几条该规则出现。

3

ECMAScript有两个零号码:+0-0

他们大多数比较算法视为相等:

+0 == -0   // true (Equality comparison) 
+0 === -0   // true (StrictEquality comparison) 
[+0].includes(-0) // true (SameValueZero comparison) 

但是,它们是不同的数值:

Object.is(+0, -0) // false (SameValue comparison) 

通常情况下,这两个零在数学计算中表现相同。然而,

1/+0 === +Infinity 
1/-0 === -Infinity 

在这种情况下,你会得到-0因为Math.round定义如下:

如果X小于0,但大于或等于-0.5,结果是 -0。

在一般情况下,如果你有-2 和2 -1之间的整数,你想如果是-0将其转换为+0,并且不以其他方式改变它,你可以使用按位OR:

-1 | 0 // -1 
-0 | 0 // +0 
+0 | 0 // +0 
+1 | 0 // +1 

然而,在你的情况,你可以只取Math.round-1外:

Math.round(Math.random()*2) - 1 

但是使用Math.round的注意将会产生不均匀的概率分布。考虑使用

Math.floor(Math.random()*3) - 1