具有整数值 + 硬编码十进制数(相同符号)的数字是否生成与硬编码预期十进制数相同的值(例如:10.0+0.1===10.1)?
Does an number with integer value + hardcoded decimal number(same sign) generate same value as hardcoded expected decimal number (eg:10.0+0.1===10.1)?
注意:我不是在问 Is floating point math broken? ,因为我问的是整数值+另一个带 dec 的十进制数而不是十进制数+十进制数。
例如,10.0+0.1 生成一个有舍入误差的数字,10.1 生成另一个有舍入误差的数字,我的问题是,10.0+0.1 生成的误差量是否与 10.1 相同,因此 10.0+0.1===10.1变得等于 true?
更多示例:
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 是硬编码的)?
没有。 JavaScript 只有花车。这是一个失败的案例。
10000.333333333333 + 1.0 // 10001.333333333332
将整数值与浮点值相加产生的结果等于精确的数学结果通常是不正确的。一个反例是 10 + .274 === 10.274
的计算结果为 false。
你应该明白,在10.0+0.123 === 10.123
中,你不是在比较10.123与10.123相加的结果。这段代码的作用是:
- 将“10.0”转换为二进制浮点数,得到 10。
- 将“0.123”转换为二进制浮点数,得到 0.1229999999999999982236431605997495353221893310546875。
- 将以上两项相加,得到 10.1229999999999993320898283855058252811431884765625。 (请注意,此结果并非精确总和;它已四舍五入为最接近的可表示值。)
- 将“10.123”转换为二进制浮点数,得到 10.1229999999999993320898283855058252811431884765625。
- 比较后两个值。
因此,比较returns正确的原因不是因为加法没有舍入误差,而是因为左边的舍入误差恰好等于右边的舍入误差。 (注意:将包含小数的字符串转换为二进制浮点数是一种数学运算。当数学结果不能精确表示时,会产生最接近的可表示值。差异称为舍入误差。)
如果你尝试 10 + .274 === 10.274
,你会发现它们不同:
- “10”转为二进制浮点数为10
- “.274”转换为二进制浮点数为0.27400000000000002131628207280300557613372802734375.
- 将以上两项相加得到 10.2740000000000009094947017729282379150390625。
- “10.274”转换为二进制浮点数是 10.2739999999999991331378623726777732372283935546875.
注意:我不是在问 Is floating point math broken? ,因为我问的是整数值+另一个带 dec 的十进制数而不是十进制数+十进制数。
例如,10.0+0.1 生成一个有舍入误差的数字,10.1 生成另一个有舍入误差的数字,我的问题是,10.0+0.1 生成的误差量是否与 10.1 相同,因此 10.0+0.1===10.1变得等于 true?
更多示例:
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 是硬编码的)?
没有。 JavaScript 只有花车。这是一个失败的案例。
10000.333333333333 + 1.0 // 10001.333333333332
将整数值与浮点值相加产生的结果等于精确的数学结果通常是不正确的。一个反例是 10 + .274 === 10.274
的计算结果为 false。
你应该明白,在10.0+0.123 === 10.123
中,你不是在比较10.123与10.123相加的结果。这段代码的作用是:
- 将“10.0”转换为二进制浮点数,得到 10。
- 将“0.123”转换为二进制浮点数,得到 0.1229999999999999982236431605997495353221893310546875。
- 将以上两项相加,得到 10.1229999999999993320898283855058252811431884765625。 (请注意,此结果并非精确总和;它已四舍五入为最接近的可表示值。)
- 将“10.123”转换为二进制浮点数,得到 10.1229999999999993320898283855058252811431884765625。
- 比较后两个值。
因此,比较returns正确的原因不是因为加法没有舍入误差,而是因为左边的舍入误差恰好等于右边的舍入误差。 (注意:将包含小数的字符串转换为二进制浮点数是一种数学运算。当数学结果不能精确表示时,会产生最接近的可表示值。差异称为舍入误差。)
如果你尝试 10 + .274 === 10.274
,你会发现它们不同:
- “10”转为二进制浮点数为10
- “.274”转换为二进制浮点数为0.27400000000000002131628207280300557613372802734375.
- 将以上两项相加得到 10.2740000000000009094947017729282379150390625。
- “10.274”转换为二进制浮点数是 10.2739999999999991331378623726777732372283935546875.