javascript - Native BigInt 和 Intl.NumberFormat 用于准确的货币计算和显示?

标签 javascript google-chrome bigint currency-formatting

您可能知道,JavaScript 中的 0.1 + 0.2 == 0.30000000000000004。处理金钱时精确度有限可能是个问题。为了克服这个问题,可以使用 BigInt ,这显然需要整数值。

不用美元作为基本单位和美分作为小数部分(例如 0.10 代表 ¢10),使用美分作为基本单位很容易(10 代表 ¢10)使其仅包含整数。

但是,当呈现给用户时,您可能希望以美元而非美分显示值(value)。但是你不能将 BigInt 除以 Number:

> BigInt(10) / 100
Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

另一方面,Intl.NumberFormat似乎也没有提供一种方法来做这样的事情。那么,您可以做什么呢?

由于以 10 为基数,一种直接的方法是在位置 -2 处插入一个句点到数字字符串中并将其传递给格式化程序:

let formatter = Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD"
})
let s = (BigInt(10) + BigInt(20)).toString() // "30"
s = s.padStart(2, "0")                       // zero-pad single digit (if input 0..9)
s = s.slice(0, -2) + "." + s.slice(-2)       // ".30"
formatter.format(s)                          // "$0.30"

这是要走的路吗?有更好的解决方案吗?

我知道 format(0.30000000000000004) 也会因为四舍五入而导致 $0.30 但这是一个关于 BigInt + UI 的一般性问题。

最佳答案

您可以将 bigint 值除以 100n (bigint 100) 以获得正确的美元数:

function toDollarsString(total) {
  const dollars = total / 100n;
  const cents = total % 100n;
  return `\$${dollars}.${cents}`;
}

console.log(toDollarsString(30n));
console.log(toDollarsString(1024n));

关于javascript - Native BigInt 和 Intl.NumberFormat 用于准确的货币计算和显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51983700/

相关文章:

javascript - 将字符串数组转换为 float (?!?!)

javascript - Chrome 显示 "Resource interpreted as Stylesheet but transferred with MIME type text/html"

ruby-on-rails - 获取 "value "300000200 0"is out of range for type integer"

javascript - BigInt 模 float

javascript - 地理定位 watch 不会持续触发

javascript - 如何使用 google-appscripts 在我的电子邮件中将 google 幻灯片作为附件发送?

google-chrome - Chrome 语音 API 网络错误

c++ - BigInteger 实现,进位不符

javascript - 加载网站的 HTML 是否会为该网站产生流量?

android - Chrome 报告来自不同计算机的同一站点的 2 种不同的 SSL 挂锁状态,可能受到感染?