Intl.NumberFormat.prototype.format() 中的默认舍入策略

Nic*_*nov 6 javascript decimal ecmascript-6

我想了解使用Intl.NumberFormat.prototype.format()时隐式发生的小数舍入行为。格式函数的 MDN 文档缺乏对该行为的清晰描述。

我们以下面这段代码为例:

const amount = 654321.985;
const formattedAmount = new Intl.NumberFormat('en-EN', {
    style: 'currency',
    currency: 'EUR',
}).format(amount);

console.log(formattedAmount); // => €654,321.99
Run Code Online (Sandbox Code Playgroud)

这种情况下的舍入策略是什么,它取决于什么?我认为涉及许多因素,例如浏览器、语言环境和货币,但找不到对此的确认。

玩弄这个示例后,我可以看到小数部分向上舍入一分,而对于以下任何部分,即.9849变为.98. 该策略似乎遵循nearest integer, ties to even规则。同时,我明白考虑到ECMAScript 规范,逻辑可能会更复杂。

Bog*_*Biv 3

从 MDN 示例来看,如下:

\n
Intl.NumberFormat(\'en-EN\', {\n    style: \'currency\',\n    currency: \'EUR\',\n}).resolvedOptions()\n\n// properties\ncurrency: "EUR"\ncurrencyDisplay: "symbol"\ncurrencySign: "standard"\nlocale: "en"\nmaximumFractionDigits: 2\nminimumFractionDigits: 2\nminimumIntegerDigits: 1\nnotation: "standard"\nnumberingSystem: "latn"\nsignDisplay: "auto"\nstyle: "currency"\nuseGrouping: true\n__proto__: Object\n
Run Code Online (Sandbox Code Playgroud)\n

您在第 13.2 节和第 13.3 节提供的 TC39 文档似乎内容丰富:

\n
// typing Intl.NumberFormat in console results takes you nowhere, but\n// typing `Intl.NumberFormat.prototype` in console results in:\nconstructor: \xc6\x92 NumberFormat()\nformat:\nformatToParts: \xc6\x92 formatToParts()\nresolvedOptions: \xc6\x92 resolvedOptions()\nSymbol(Symbol.toStringTag): "Intl.NumberFormat"\nget format: \xc6\x92 format()\n
Run Code Online (Sandbox Code Playgroud)\n

13.3.3内部插槽:

\n
\n

必须是包含子字符串“{number}”的字符串值。\n“positivePattern”必须包含子字符串“{plusSign}”,但不能包含\n“{minusSign}”;

\n
\n

模式似乎具有以下形状 PositivePattern = "{plusSign}{number}"

\n

也在13.4.5 Intl.NumberFormat.prototype.resolvedOptions ( )处达到峰值:

\n
[[MinimumIntegerDigits]]    "minimumIntegerDigits"\n[[MinimumSignificantDigits]]    "minimumSignificantDigits"\n[[MaximumSignificantDigits]]    "maximumSignificantDigits"\n
Run Code Online (Sandbox Code Playgroud)\n

另外,不要忘记检查 MDN:\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat

\n