使用Math.round后在JavaScript中使用-0?什么是-0?

时间:2015-10-19 00:06:47

标签: javascript

我只想生成范围<-1,1>中的随机整数,即-1,0或1.我认为这段代码指出了它:

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

但是除了-1,0和1之外我还有一个价值。我不确定应该是什么:

image description

现在我不认为这是实施错误,但如果是,我使用的是Firefox 41,同样的事情发生在Google Chrome 39.当我尝试在控制台中记录-0时它显示为-0但转换为-0的{​​{1}}显示为String。它是什么?我可以将它用于某些东西,比如一些很酷的编程黑客和解决方法吗?如果我不忽视它会导致一些错误吗?

3 个答案:

答案 0 :(得分:5)

两个零

因为JavaScript的数字保持大小和符号分开,所以每个非负数都有负数,包括0。 这样做的理由是,无论何时以数字方式表示数字,它都会变得如此之小以至于无法与0区分,因为编码不够精确,无法表示差异。然后有符号的零允许您记录“从哪个方向”接近零;也就是说,数字在被认为是零之前有什么标志。

来自here

如果您有兴趣,请提供更多技术资料。

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

标准定义

  • 算术格式:二进制和十进制浮点数据的集合,由有限数字(包括有符号零和次正规数),无穷大和特殊数字组成,而不是数字&#34;值(NaNs)
  • 交换格式:可用于以高效紧凑的形式交换浮点数据的编码(位串)
  • 舍入规则:在算术和转换期间舍入数字时要满足的属性
  • 操作:算术格式的算术运算和其他运算 异常处理:异常情况的指示(如除零,溢出等)

答案 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(一)之间的数字,因此您将有几次出现该规则。