您可能知道,JavaScript中的0.1 + 0.2 == 0.30000000000000004。在处理金钱时,有限的精确度可能是一个问题。要克服这一点,可以使用BigInt,它显然需要整数值。
不用美元作为基本单位,使用美分作为小数(例如,10美分的0.10 ),可以很容易地使用10美分作为基本单位(10美分的10),使其仅为整数。
但是,当呈现给用户时,您可能希望以美元而不是美分来显示价值。但是你不能用Number除以BigInt
> 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的一般性问题。
发布于 2021-11-23 18:26:24
您可以将bigint值除以100n (Bigint100),以获得正确的美元数:
function toDollarsString(total) {
const dollars = total / 100n;
const cents = total % 100n;
return `\$${dollars}.${cents}`;
}
console.log(toDollarsString(30n));
console.log(toDollarsString(1024n));
发布于 2018-08-23 18:33:48
正如错误消息所述,显式地将您的BigInt转换为Number。不要像现在这样使用中间字符串:
let toDisplayValue = n => Number(n) / 100;
console.log(toDisplayValue(BigInt(1234567)));
console.log(toDisplayValue(BigInt(45)));
https://stackoverflow.com/questions/51983700
复制相似问题