您可能知道,JavaScript 中的
0.1 + 0.2 == 0.30000000000000004
。处理金钱时精确度有限可能是一个问题。为了克服这个问题,可以使用 BigInt,这显然需要整数值。
不用美元作为基本单位,美分作为小数部分(例如
0.10
表示 10 欧元),可以很容易地使用美分作为基本单位(10
表示 10 欧元),使其仅是整数。
但是,当呈现给用户时,您可能希望以美元而不是美分显示价值。但你不能将
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));