我只想生成范围<-1,1>
中的随机整数,即-1,0或1.我认为这段代码指出了它:
Math.round(Math.random()*2-1)
但是除了-1,0和1之外我还有一个价值。我不确定应该是什么:
现在我不认为这是实施错误,但如果是,我使用的是Firefox 41,同样的事情发生在Google Chrome 39.当我尝试在控制台中记录-0
时它显示为-0
但转换为-0
的{{1}}显示为String
。它是什么?我可以将它用于某些东西,比如一些很酷的编程黑客和解决方法吗?如果我不忽视它会导致一些错误吗?
答案 0 :(得分:5)
两个零
因为JavaScript的数字保持大小和符号分开,所以每个非负数都有负数,包括0。 这样做的理由是,无论何时以数字方式表示数字,它都会变得如此之小以至于无法与0区分,因为编码不够精确,无法表示差异。然后有符号的零允许您记录“从哪个方向”接近零;也就是说,数字在被认为是零之前有什么标志。
来自here
如果您有兴趣,请提供更多技术资料。
-0和+0的实现由IEEE于1985年作为IEEE 754 standard的一部分引入。在各种浮点实现中发现的标准many problems使得它们难以可靠且可移植地使用。
标准定义
答案 1 :(得分:3)
ECMAScript有两个零号:/3.0/lists/{list_id}/interest-groupings
和+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
,因为Math.round
的定义如下:
如果 x 小于0但大于或等于-0.5,则结果为 -0。
一般情况下,如果你有一个介于-2 31 和2 31 -1之间的整数,并且你想将其转换为-0
,如果它&# 39; s +0
,否则不要改变它,你可以使用按位OR:
-0
但是,在您的情况下,您可以在-1 | 0 // -1
-0 | 0 // +0
+0 | 0 // +0
+1 | 0 // +1
之外取-1
:
Math.round
但是使用Math.round(Math.random()*2) - 1
注意会产生非均匀的概率分布。考虑使用
Math.round
答案 2 :(得分:2)
函数Math.round
的工作方式与the standard:
如果x小于0但大于或等于-0.5,则结果为-0。
Math.random
专门返回0(零)和1(一)之间的数字,因此您将有几次出现该规则。