如果x个是15位十进制整数,然后进行转换x个到JavaScript编号
,除以100,然后将结果转换为具有15个有效十进制数字的数字,即可精确生成x个/100.证据如下。
笔记:
- 将除法结果转换为具有15位有效十进制数字的数字,可以得到精确的结果x个/100.除法的实际结果,当它位于
编号
格式,通常不会x个/例如,73/100产生0.729999999999999982236431605997495353221893310546875。
- 将除法结果转换为更多超过15位有效小数通常也不会产生x个/100,因为额外的数字可能会显示差异,如上面的.73所示。(当然,使用较少的数字可能不足以表示x个/100.)因此,如果希望准确沟通x个/100到另一个进程,则必须精确到15个有效十进制数字(或其他一些错误缓解措施)。
- 下面的证明适用于15位整数x个,不适用于其他15位有效小数(例如15位十进制数字后跟一个或多个零的数字,或以小数点开头的数字,后跟一些零,然后是15位有效数字)。
前期工作
JavaScript是ECMAScript的实现,在埃克玛-262和ISO/IEC 16262。在第6.1.6条中,Ecma-262规定IEEE-754基本64位二进制浮点格式用于ECMAScript编号
类型,但只使用单个NaN。第6.1.6条进一步描述了所使用的算法,该算法本质上是IEEE-754算法,具有四舍五入、ties-to-even。
IEEE-754基本64位二进制浮点格式使用53位有效位。
二进制浮点数的最小精度单位(ULP)是指赋予其有效位中最低有效位位置的值。(因此,ULP按指数缩放。)以ULP度量,所有正常的53位有效位都在[2]中52ULP,2个53ULP)。
对于15位有效的十进制数,其ULP将是归因于15位位置的值第个从前导有效数字开始倒数的数字位置。
引理
首先,我们确定了一个众所周知的事实,即将一个15位有效的小数转换为编号
如果数字在编号
格式。
如果x个是浮点格式(2)正常范围内的15个有效十进制数字(不一定是整数)−1022≤ |x个| < 21024),然后转换x个将结果转换为浮点格式中可表示的最接近的值,然后将结果转换成15位有效的十进制数字x个,当两个转换都是以四舍五入到最近、ties-to-even的方式执行时。为了看到这一点,让我们年是第一次转换的结果。如果年不同于x个小于ULP的½x个,然后x个是最接近的15位有效数字年因此必须是第二次转换的结果。
在第一次转换中,结果年距离最多为½ULPx个,由于舍入规则。这是一个至多½/2的相对精度52(即潜在的½ULP误差除以可用ULP测量的最小有效位)。因此,年不同于x个最多2分之一53在最坏的情况下x个可以是9999999999999=1015−1,因此相对于ULP的误差x个将是(1015−1)/253,约为ULP的.111倍x个因此,年总是不同于x个小于其ULP的½,因此转换年返回到15位有效的十进制数字会产生x个.
证明
如果x个是一个15位小数的整数,它在编号
格式,因为编号
格式的有效位为53位,因此能够精确表示最多为2的所有整数53,约9.007e15,大于1015.
因此,转换x个到编号
产量准确x个没有错误。
然后,根据算术结果的舍入规则x个以100表示最接近的数字x个/100.叫这个年现在请注意x个/100是一个可以用15位有效小数表示的数字。(它可以用科学记数法写成x个•10−2或在源代码中作为的数字x个后缀为电子2
.)注意转换x个/100至编号
也会产生收益年,因为转换产生的数字与除法一样,在编号
最接近的格式x个/100.通过引理,转换的结果x个/100至编号
并返回到15个有效的小数位数x个/100,因此转换的结果x个到编号
,然后除以100,再转换为15个有效的十进制数字也会得到x个/100.