对于2个幅度相同但符号相反的浮点数,其绝对值是否完全相等?

时间:2019-11-27 01:47:57

标签: javascript floating-point

例如:

var a=x.yz;
var b=-x.yz;

在四舍五入到“错误”值之后,-a等于b吗?

还是会四舍五入为Math.round(2.5)和Math.round(-2.5)之类的不同值?

2 个答案:

答案 0 :(得分:0)

如果数字不超过20个有效十进制数字,则转换带有-的数字和不带有-的数字的结果除符号外完全相同。

JavaScript是Ecma-262和ISO / IEC 16262中指定的ECMAScript的实现。Ecma-262指定使用IEEE-754 64位二进制浮点格式,除了存在单个NaN值。

条款7.1.3.1指定如何将字符串(包含数字,例如1.2345)转换为数字。除非该数字是具有20个以上有效数字的十进制数字,否则将按照第6.1.6节的规定进行转换,该节指定了与IEEE-754的“从最近到最近的关系到偶数的舍入”方法相对应的舍入规则。该方法相对于符号是对称的,因此将数字的负数转换为JavaScript Number的结果等于将数字的负数转换为Number的结果。

如果该数字具有20个以上的有效十进制数字,则第7.1.3.1节允许实现使用最接近源数字的两个20位数字中的任何一个。该文档没有对此选择施加任何进一步的要求,因此在这种情况下,JavaScript实现可能在符号方面具有不对称的行为。但是,这样做将是一个糟糕的实现选择。

答案 1 :(得分:-1)

https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#round-float-

正如文档所述,Math.random(float)将舍入为正无穷大,这将帮助您理解Math.round(2.5)和Math.round(-2.5)为什么返回不同的值。因此,在您的情况下-(-a)实际上将四舍五入为+ a。