Gua*_*Lin 1 javascript floating-point precision
在JavaScript中,每个人都知道着名的计算:0.1 + 0.2 = 0.30000000000000004
.但是为什么JavaScript打印这个值而不是打印更准确和精确0.300000000000000044408920985006
?
将值转换为Number
十进制数字时,JavaScript的默认规则是使用足够的数字来区Number
分值.(您可以使用该toPrecision
方法请求更多或更少的数字.)
JavaScript使用IEEE-754基本64位二进制浮点作为其Number
类型.使用IEEE-754,结果.1 + .2
正好是0.3000000000000000444089209850062616169452667236328125.结果来自:
Number
类型中可表示的最近值.Number
类型中可表示的最近值.Number
类型中可表示的最近值.格式化此Number
值以进行显示时,"0.30000000000000004"只有足够的有效数字来唯一地区分该值.要查看此信息,请观察相邻值是:
0.299999999999999988897769753748434595763683319091796875
,0.3000000000000000444089209850062616169452667236328125
,和0.300000000000000099920072216264088638126850128173828125
.如果转换为十进制数字仅产生"0.3000000000000000",则它将更接近0.299999999999999988897769753748434595763683319091796875而不是0.3000000000000000444089209850062616169452667236328125.因此,需要另一个数字.当我们有这个数字"0.30000000000000004"时,结果比它的任何一个邻居更接近0.3000000000000000444089209850062616169452667236328125.因此,"0.30000000000000004"是最短的十进制数字(忽略了用于美学目的的前导"0"),其唯一地区分Number
原始值的哪个可能值.
此规则来自ECMAScript 2017语言规范的第7.1.12.1节中的步骤5,这是将Number
值m转换为ToString
操作的十进制数字的步骤之一:
否则,设Ñ,ķ,和小号是整数,使得ķ ≥1,10 ķ -1 ≤ 小号 <10 ķ,为对数的值小号 ×10 ñ - ķ是米,并且ķ是尽可能小.
这里的措辞有点不精确.我花了一段时间才弄清楚通过" s ×10 n - k的Number
数值",标准意味着将数学值s ×10 n - k转换为Number
类型的结果(通常情况下)四舍五入).在本说明书中,k是将要使用的有效位数,并且此步骤告诉我们最小化k,因此它表示使用最小数量的数字,这样我们生成的数字将转换回Number
类型,产生原始数m.
归档时间: |
|
查看次数: |
168 次 |
最近记录: |