[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
来使其等于结果?
答案 0 :(得分:1)
因为十进制,就像float或double一样,精度有限。尝试
1m/3m + 1m/3m + 1m/3m
你得到0.999 ... 9,而不是1。
它与指数基数的倍数和大小不同。在精确度方面,它介于双倍和四倍之间。十进制和双精度之间的唯一区别是:
它可以在除以素因子2或5时准确表示数字,否则结果将是重复的十进制数。 12具有素数因子3,因此这种除法的结果将不准确。
请改用400m/12m/2m
。我保证它将完全等于result
。