原生 BigInt 和 Intl.NumberFormat 用于准确的货币计算和显示?

问题描述 投票:0回答:1

您可能知道,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 的一个普遍问题。

javascript google-chrome bigint currency-formatting
1个回答
1
投票

您可以将

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));

© www.soinside.com 2019 - 2024. All rights reserved.