javascript - 巨大 float 的国际格式

标签 javascript ecmascript-intl

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

例如,使用 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

最佳答案

Is there some kind of limit? Does that limit change as I increase decimal precision?

是的,是的。 JavaScript 中的 float 本身存储在 64 位空间中,这意味着它们可以表示的精度受到限制。请参阅this answer了解更多信息。

How would I be able to figure out where these numbers start to get inconsistent?

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

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)

关于javascript - 巨大 float 的国际格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43148152/

相关文章:

javascript - 从其键与特定条件与javascript和下划线匹配的对象返回键值对

javascript - Chrome 中指定的时区无效 : US/Alaska, US/Arizona、US/Mountain、US/Central 等错误但在 Mozilla 中工作

Javascript 分割字符串在 .但不是 。引号后

C# 类似于 Javascript 中的事件

javascript - 如何在 google maps api v3 中的标记集群对象中的各个集群中找到标记?

javascript - 无法静态分析第16行的 'require(…, …)'

javascript - Intl 未定义 firefox

javascript - 边缘 15 中的 "Intl not available"

javascript - Number.prototype.toLocaleString() 和 Intl.NumberFormat.prototype.format 之间有什么关系?