【发布时间】:2020-08-28 20:37:18
【问题描述】:
我有这样的操作:
const amount = 100;
const rate = 0.32123;
const a = amount * rate;
a // 32.123000000000005
const b = a / rate;
b // 100.00000000000001
转换后我需要数字相同。我怎样才能做到这一点?双向转换是必需的。我有很多货币。每种货币都有内部货币的兑换率(我们称之为 myCurr)。我无法立即将一种货币转换为另一种货币(内部货币除外),因为我仅对内部货币进行了转换评级。所以我需要首先将货币 A 转换为内部货币(A * rate1),然后我需要将 A 转换为目标货币,方法是将其除以 rate2。但这样做有时会导致精度下降。金额 * rate1 / rate2 有什么替代方案吗?
【问题讨论】:
-
Javascript 使用 IEEE-754 binary64。每次操作的误差最多为 2^53 的一部分。
amount * rate / rate中的综合误差最多为 (1+2^−53)^2−1,略多于 2^52 的一部分。如果amount是量化的——意味着它不能是任意值,但必须是某个最小货币数量的倍数(例如一美元或其他货币的千分之一),并且不能太大(因此它永远不会超过,比如说,2^50,大约一万亿,这些单位),那么可以对结果进行四舍五入以恢复原始值。 -
请注意,如果
amount允许使用分数,例如当货币为美元时,0.01 表示美分,那么它已经包含了一个舍入误差,应该在应用程序设计中加以考虑,因为 0.01 不能以 IEEE-754 binary64 表示。另请注意,上述注释仅适用于连续执行一次乘法和一次除法。如果还有其他操作,错误分析就更复杂了。