大型浮点数的Intl格式

时间:2017-03-31 19:18:23

标签: javascript ecmascript-intl

我试图更好地理解为什么具有潜在大精度的大数字处理不一致,特别是在JavaScript及其本地化设施(例如ECMA-402 / Intl)中。我假设这与使用浮点数有关,但我想了解限制的位置和/或如何避免这些陷阱。

例如,使用Intl.NumberFormat:

console.log(new Intl.NumberFormat('en-US', { minimumFractionDigits: 3, maximumFractionDigits: 3 }).format(9999999999990.001)); // logs 9,999,999,999,990.000

let test1 = 9999999999990.001
console.log(test1);  // logs 9999999999990.002

我怎样才能弄清楚这些数字开始变得不一致的地方?有某种限制吗?当我增加小数精度时,这会限制更改,例如:

let test2 = 9999999999990.0004;
console.log(test2) // logs 9999999999990

1 个答案:

答案 0 :(得分:1)

  

有某种限制吗?当我增加小数精度时,这会限制更改吗?

是的,是的。 JavaScript中的浮点数本身存储在64位空间中,这意味着它们可以表示的精度受到限制。有关详细信息,请参阅this answer

  

我怎样才能弄清楚这些数字开始变得不一致的地方?

将您的“数字文字”传递给字符串形式的函数,并检查该字符串是否在强制转换为数字后返回正确的文字:

function safeNumber (s) {
  if (String(+s) !== s)
    throw new Error('Unsafe number!')
  return +s
}

let safe = safeNumber('999999999999999')
console.log(safe)

let unsafe = safeNumber('9999999999990.001')
console.log(unsafe)