注意:我没有询问Is floating point math broken?,因为我询问带有整数值的数字+带有十进制而不是十进制数字+十进制数字的另一个十进制数字。
例如,10.0 + 0.1生成一个带有舍入误差的数字,10.1生成另一个带有舍入误差的数字,我的问题是,10.0 + 0.1生成相同的误差量为10.1,以便10.0 + 0.1 === 10.1变得相等真的吗?
更多示例:
10.0+0.123 === 10.123
2.0+4.68===6.68
通过测试它们是正确的,第一个数字是10.0和2.0,它们是整数值。整数+硬编码浮点数(相同符号)是否恰好等于硬编码的预期浮点数?或者换句话说,a.0 + b.cde是否恰好等于(a + b).cde(其中a,b,c,d,e是硬编码的)?
答案 0 :(得分:1)
没有。 JavaScript只有浮点数。这是一个失败的案例。
10000.333333333333 + 1.0 // 10001.333333333332
答案 1 :(得分:1)
将一个整数值添加到浮点值通常不会产生等于精确数学结果的结果。一个反例是10 + .274 === 10.274
评估为假。
您应该明白,在10.0+0.123 === 10.123
中,您没有将添加.123到10的结果与10.123进行比较。这段代码的作用是:
因此,比较返回true的原因不是因为加法没有舍入误差,而是因为左边的舍入误差恰好等于右边的舍入误差。 (注意:将包含小数的字符串转换为二进制浮点数是一种数学运算。当数学结果不能完全表示时,会产生最接近的可表示值。这种差异称为舍入误差。)
如果您尝试10 + .274 === 10.274
,您会发现它们有所不同: