在存储库代码中,在另一个团队开发的模块中,我发现有一个价格从美分到欧元的转换,只需将数字除以100。
代码是用Javascript编写的,所以它使用IEEE 754标准。
我知道以浮点数的形式处理货币值是不安全的,但在将任务发送给另一个团队之前,我想知道这种情况是否安全。
到目前为止,我还没有发现整数除以100会得到不准确的结果的任何情况。让我们更进一步:100就是2*2*5*5。
我们知道用2除以一个数字是安全的,因为它正好等于一个位置的移位。
所以我们可以很容易地说,如果存在一个不能被5精确整除的数字,那么除以100是不准确的。
我做了很多测试,都没有找到这些数字,但我还远不能从理论上证明这篇论文。
那么,在IEEE754标准中,将一个数字除以100是安全的吗?
发布于 2019-03-13 05:56:11
精度为15位有效数字的浮点十进制数将转换为64位二进制浮点数(JavaScript中的Number),然后再转换回十进制数,而不会损失精度。请注意,虽然二进制数可能不能准确地存储十进制数,但它有更多的精度位(表示它至少需要17位十进制有效数字),并精确地四舍五入地转换回原始十进制数。有关详细信息,请参阅see https://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。
除以100时,二进制结果仍具有64位精度,但可能存在以最小精度(尾数的最低位)为单位的误差,除非结果下溢为0(有关详细信息,请参见What Every Computer Scientist Should Know About Floating-Point Arithmetic )。它仍然可以四舍五入到15个有效小数位内的正确数字。
换句话说,如果十进制数的有效位数不超过15位,那么除以100可以保持该精度。
例如,在浏览器控制台中尝试123456789012345 / 100和0.000123456789012345 / 100 (这两个数字都有15位有效小数位精度)-这些除法返回15位有效小数位内的正确小数:
123456789012345 / 100
1234567890123.45
0.000123456789012345 / 100
0.00000123456789012345https://stackoverflow.com/questions/55127530
复制相似问题