【发布时间】:2018-01-31 11:03:42
【问题描述】:
我在 chrome(v60.0.3112.101) 控制台中对Number.prototype.toFixed 方法做了一些测试,发现……让我很困惑。
为什么1.15.toFixed(1) 返回“1.1”而不是“1.2”?
为什么1.05.toFixed(1) 返回“1.1”而不返回“1.0”?
等等...
我在ECMAScript specification做研究。
注意 1 toFixed 返回一个字符串,其中包含以 十进制定点表示法 表示的此 Number 值,小数点后有 fractionDigits 位。如果 fractionDigits 未定义,则假定为 0。
我知道fixed point notation 是什么。但我无法解释上面的谜题。谁能给个清楚的解释?
顺便说一句,我认为specification 下的细节算法应该改进。 以 1.105 为例,相对算术如下:
令 n 为整数,n ÷ 10^f - x 的精确数学值尽可能接近于零。如果有两个这样的n,选择较大的n。
根据pick the larger n,应该考虑111而不考虑110,这与现实相矛盾。
【问题讨论】:
-
引用的规范没有说明四舍五入,还有其他方法可以对数字进行四舍五入。为什么您希望此方法执行任何舍入?
-
-
实际上数字是使用双精度浮点(en.wikipedia.org/wiki/Double-precision_floating-point_format)存储的,(1.15).toExponential(20) 给出 "1.14999999999999991118e+0" - 所以它更接近于 "1.1" ; (1.05).toExponential(20) 给出“1.05000000000000004441e+0” - 它更接近“1.1”
-
@JaromandaX 当然可以,但是 toFixed 方法和简单的四舍五入不一样。而
Math.round方法只是将数字四舍五入到最接近的整数。 -
@PageYe 我使用
Number#toExponent(20)只是为了显示更接近实际存储的数值
标签: javascript floating-point tofixed