首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本机BigInt和Intl.NumberFormat用于准确的货币计算和显示?

本机BigInt和Intl.NumberFormat用于准确的货币计算和显示?
EN

Stack Overflow用户
提问于 2018-08-23 18:29:33
回答 2查看 936关注 0票数 3

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

不用美元作为基本单位,使用美分作为小数(例如,10美分的0.10 ),可以很容易地使用10美分作为基本单位(10美分的10),使其仅为整数。

但是,当呈现给用户时,您可能希望以美元而不是美分来显示价值。但是你不能用Number除以BigInt

代码语言:javascript
复制
> BigInt(10) / 100
Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

另一方面,Intl.NumberFormat似乎也没有提供这样一种方法。那么,你能做些什么呢?

由于基数为10,一种简单的方法是将位置为-2的句号插入到数字字符串中,并将其传递给格式化程序:

代码语言:javascript
复制
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的一般性问题。

EN

回答 2

Stack Overflow用户

发布于 2021-11-23 18:26:24

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

代码语言:javascript
复制
function toDollarsString(total) {
  const dollars = total / 100n;
  const cents = total % 100n;
  return `\$${dollars}.${cents}`;
}

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

票数 1
EN

Stack Overflow用户

发布于 2018-08-23 18:33:48

正如错误消息所述,显式地将您的BigInt转换为Number。不要像现在这样使用中间字符串:

代码语言:javascript
复制
let toDisplayValue = n => Number(n) / 100;

console.log(toDisplayValue(BigInt(1234567)));
console.log(toDisplayValue(BigInt(45)));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51983700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档