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 规范,逻辑可能会更复杂。
从 MDN 示例来看,如下:
\nIntl.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\nRun 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()\nRun Code Online (Sandbox Code Playgroud)\n13.3.3内部插槽:
\n\n\n必须是包含子字符串“{number}”的字符串值。\n“positivePattern”必须包含子字符串“{plusSign}”,但不能包含\n“{minusSign}”;
\n
模式似乎具有以下形状 PositivePattern = "{plusSign}{number}"
\n也在13.4.5 Intl.NumberFormat.prototype.resolvedOptions ( )处达到峰值:
\n[[MinimumIntegerDigits]] "minimumIntegerDigits"\n[[MinimumSignificantDigits]] "minimumSignificantDigits"\n[[MaximumSignificantDigits]] "maximumSignificantDigits"\nRun Code Online (Sandbox Code Playgroud)\n另外,不要忘记检查 MDN:\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat
\n| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |