首页 > 解决方案 > 处理货币价值,将一个数字除以 100 是否安全?

问题描述

在存储库代码中,在另一个团队开发的模块中,我发现价格从美分转换为欧元,只需将​​数字除以 100。

代码是 Javascript,所以它使用IEEE 754标准。

我知道将货币值作为浮点数处理是不安全的,但在将任务发送给其他团队之前,我想知道这种情况是否安全。

到目前为止,我没有发现任何将整数除以 100 得到不准确结果的情况。让我们更进一步:100只是2*2*5*5.

我们知道将一个数字除以2是安全的,因为它只是等于一个位置的移动。

所以我们可以很容易地说,如果存在一个不能被 5 整除的数,那么被 100 整除是不准确的。

我做了很多测试,但没有找到任何这些数字,但我离论文的理论论证还很远。

那么,在 IEEE 754 标准中将数字除以 100 是否安全?

标签: javascriptieee-754ieee

解决方案


精度为 15 位有效数字的浮点十进制数转换为 64 位二进制浮点数(Number在 JavaScript 中)并返回十进制而不损失精度。尽管二进制数可能无法准确存储十进制数,但它具有更多位的精度(至少需要 17 个十进制有效数字才能表示 53 位尾数),并且可以通过四舍五入精确地转换回原始十进制数。这些额外的尾数二进制数字正是为了在 CPU 算术的所有结果中保持这 15 个有效的十进制数字精确。有关完整详细信息,请参阅往返转换所需的位数。

乘法或除法时,操作数的指数首先相等。当指数不相等时,具有较小指数的数字的尾数将右移,从而失去较低的精度。完成后,二进制结果乘法或除法仍然具有 53 位精度,并且可能以最小精度(尾数的最低位)为单位出现错误,除非结果下溢为 0(请参阅每个计算机科学家应该知道的内容)浮点算术以获得完整的细节。)。该二进制数仍通过四舍五入转换为精确的 15 个有效十进制数字内的正确十进制数。

换句话说,如果您的十进制数的有效数字不超过 15 位,那么只要除数和被除数的大小接近,将它们除以 100 就可以保持该精度。

123456789012345 / 100例如,尝试0.000123456789012345 / 100在您的浏览器控制台中(这两个数字都有 15 个有效的十进制数字精度) - 这些除法返回 15 个有效的十进制数字内的正确十进制数字:

123456789012345 / 100
1234567890123.45

0.000123456789012345 / 100
0.00000123456789012345

推荐阅读