考虑以下单元测试:
// Works (sum 0.1 to 0.4)
float f1 = 0.1F + 0.2F + 0.3F + 0.4F;
Assert.AreEqual(1F, f1);
// Works too (sum 0.4 to 0.1)
float f2 = 0.4F + 0.3F + 0.2F + 0.1F;
Assert.AreEqual(1F, f2);
// Works (sum 0.1 to 0.4)
double d1 = 0.1D + 0.2D + 0.3D + 0.4D;
Assert.AreEqual(1D, d1);
// Fails! (sum 0.4 to 0.1)
double d2 = 0.4D + 0.3D + 0.2D + 0.1D;
Assert.AreEqual(1D, d2);
对于 float 类型,一切都按预期工作(两种情况下的总和都是 1),但是当使用 double 时,加法的交换性不被尊重。确实,第一个的总和是 1,但第二个我得到 0.99999999 .....
我理解为什么结果一次是 1 而一次不是(因为某些数字不能在不损失基数 2 的精度的情况下表示),但这并不能解释为什么它适用于 float 而不是 double ...
有人可以解释一下吗?