您可能知道,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/