具有整数值+硬编码十进制数(相同符号)的数字是否与硬编码的预期十进制数生成相同的值(例如:10.0 + 0.1 === 10.1)?

时间:2018-01-31 02:58:25

标签: javascript floating-point floating-accuracy

注意:我没有询问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是硬编码的)?

2 个答案:

答案 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进行比较。这段代码的作用是:

  • 将“10.0”转换为二进制浮点数,产生10。
  • 将“0.123”转换为二进制浮点数,产生0.1229999999999999982236431605997495353221893310546875。
  • 添加以上两个,产生10.1229999999999993320898283855058252811431884765625。 (注意,这个结果不是精确的总和;它已四舍五入到最接近的可表示值。)
  • 将“10.123”转换为二进制浮点数,产生10.1229999999999993320898283855058252811431884765625。
  • 比较后两个值。

因此,比较返回true的原因不是因为加法没有舍入误差,而是因为左边的舍入误差恰好等于右边的舍入误差。 (注意:将包含小数的字符串转换为二进制浮点数是一种数学运算。当数学结果不能完全表示时,会产生最接近的可表示值。这种差异称为舍入误差。)

如果您尝试10 + .274 === 10.274,您会发现它们有所不同:

  • “10”转换为二进制浮点数为10.
  • “。274”转换为二进制浮点数为0.27400000000000002131628207280300557613372802734375。
  • 添加以上两项产生10.2740000000000009094947017729282379150390625。
  • “10.274”转换为二进制浮点数是10.2739999999999991331378623726777732372283935546875。