javascript 中的货币转换和浮点精度

Currency conversion in javascript and float precision

提问人:fossmoat 提问时间:2/27/2023 最后编辑:fossmoat 更新时间:2/27/2023 访问量:138

问:

由于 JavaScript 在浮点数方面有其怪癖(例如,0.1+0.2 是 0.3 > 以及类似的除法),如何处理货币转换?通常,货币兑换率从小数点后 6 位或更多位开始浮动。将它们从一种货币转换为另一种货币,再到另一种货币,似乎很容易出现 javascript 浮点错误。虽然货币兑换是很常见的任务,但我想知道人们通常如何处理这个问题?

目前,我没有任何解决方案,也不确定它过去是否引起了问题。即使我有这个问题,也很可能会错过。我只是使用我拥有的任何货币汇率,然后乘/除以获得另一种货币。这就是我目前处理货币的方式

  1. 第三方 API 获取货币汇率。示例响应USD{ base: 'USD', rates: { INR: 80.8653858542, GBP: ... } }
  2. 我假设虚拟货币与例如.这个比率永远不会改变。我选择了印度卢比,因为这是我的银行账户货币。我使用虚拟货币来确保无论汇率如何,我都可以始终向用户显示可预测的金额。XXXINR1 XXX = 200 INR
  3. 我使用这种虚拟货币作为基础货币。因此,无论我从第 1 步收到什么利率,我都会将其转换为即 最后,价目表变为 ' { base: XXX, rates: { INR: 200, USD: 0.404326929271 }USDXXXusdToXXX = usdToInr/200 = 80.8653858542/200 = 0.404326929271
  4. 现在,对于所有转换,我都使用XXX的价目表
javascript 货币 浮动精度

评论

0赞 Barmar 2/27/2023
乘以转换率后,将数字四舍五入到适当的十进制位数。
0赞 fossmoat 2/27/2023
如何选择合适的数字进行四舍五入?即使我这样做了,浮点计算不会导致意外的输出吗?
0赞 Barmar 2/27/2023
如果是美元,则适当的数字是 2 位数字,因为这是最小的金额。
1赞 user229044 2/27/2023
这不是 JavaScript 的问题,每种语言都是一样的。请参阅 stackoverflow.com/questions/588004/...docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
0赞 Barmar 2/27/2023
无论如何,不要担心错误。它非常小,四舍五入会丢弃它。

答:

-1赞 RandomUser123 2/27/2023 #1

您可以使用适用于 JavaScript 的“任意精度十进制/浮点数”库 - 找到适合您情况的库。

据我所知,这些工作方式是将数字存储为不同的表示形式并使用不同的算法 - 类似于您用来“手动”添加/减法/乘法/除法数字的技术

相比之下,原始数字类型(整数、浮点数等)直接使用处理器,因此存在溢出、精度错误等问题