为什么这两个数学上相等的小数不同?

时间:2015-01-05 16:29:19

标签: c# unit-testing decimal

[Test]
public void Calculation()
{
  decimal a = 400m;
  decimal b = 12m;
  decimal c = 2m;
  var result = a / b / c;

  Assert.AreEqual(result, 400m / 24m);
}

测试结果:失败 结果消息:
预计:16.666666666666666666666666666m
但是:16.666666666666666666666666667m

为什么这两个小数有所不同?
我可以使用什么代替400m / 24m来使其等于结果?

1 个答案:

答案 0 :(得分:1)

因为十进制,就像float或double一样,精度有限。尝试

1m/3m + 1m/3m + 1m/3m

你得到0.999 ... 9,而不是1。

它与指数基数的倍数和大小不同。在精确度方面,它介于双倍和四倍之间。十进制和双精度之间的唯一区别是:

  • decimal更大(128位)
  • decimal是base-10(即2 * 5),而double是base-2。

它可以在除以素因子2或5时准确表示数字,否则结果将是重复的十进制数。 12具有素数因子3,因此这种除法的结果将不准确。

请改用400m/12m/2m。我保证它将完全等于result