所以我试图理解JavaScript在处理大量数据时的行为。考虑以下(在Firefox和Chrome测试):处理大量数据时中点“四舍五入”?
console.log(9007199254740993) // 9007199254740992
console.log(9007199254740994) // 9007199254740994
console.log(9007199254740995) // 9007199254740996
console.log(9007199254740996) // 9007199254740996
console.log(9007199254740997) // 9007199254740996
console.log(9007199254740998) // 9007199254740998
console.log(9007199254740999) // 9007199254741000
现在,我知道为什么它的输出“错误”数字—它试图将它们转换为浮点表示,它的四舍五入到最接近可能的浮点值—但我不完全确定它为什么选择这些特定的数字。我的猜测是,它正在尝试四舍五入到最接近的“偶数”,并且由于9007199254740996可以被4整除,而9007199254740994不可以,所以它认为9007199254740996更“平均”。
- 它使用什么算法来确定内部表示?我的猜测是它是规则中点舍入的扩展(舍入到甚至是IEEE 754函数中的默认舍入模式)。
- 此行为是否被指定为ECMAScript标准的一部分,还是与实施相关?
@RobG:评估'console.log(9007199254740993)'涉及两次转换:一次是将JavaScript代码中的十进制文字转换为内部二进制浮点格式,另一次是将内部二进制格式转换为十进制执行'log'方法时用于控制台输出的字符串。这些转换中的每一个都需要相当复杂的算法(如果做得好的话)。所以说没有算法是不正确的。 –
是的,认为这不是一个舍入算法。 – RobG
确实如此,但舍入是算法的重要组成部分:十进制到二进制转换必须决定如何将精确的十进制值转换为可用IEEE 754 binary64格式表示的最接近的数字。该决定的一部分涉及选择以哪种方式进行取整,而常规惯例是使用环绕式转换,如@PatriciaShanahan所述。 –