关于c#:带小数的舍入问题

Rounding issues with decimal

我在整个项目中使用decimal数据类型,相信它会给我最准确的结果。不过,我遇到了这样一种情况:舍入误差正在逐渐增加,看来我最好使用双打。

我有这样的计算:

1
2
decimal tempDecimal = 15M / 78M;
decimal resultDecimal = tempDecimal * 13M;

这里,当13*15/78的正确答案为2.5时,resultdecimal为2.499999999999。这似乎是因为tempdecimal(15/78的结果)是一个循环的十进制值。

随后,我将这个结果四舍五入到小数点后零位(远离零),在这种情况下,我希望是3,但实际上是2。

如果我用双打代替:

1
2
double tempDouble = 15D / 78D;
double resultDouble = tempDouble * 13D;

然后我得到2.5的resultDouble,这就是我要找的答案。

从这个例子中,我觉得使用双精度或浮点更好,尽管它们的精度较低。我假设我能得到2.499999999999的错误结果,仅仅是因为小数可以将结果存储到小数位数,而双舍入。

我应该用双打吗?

编辑:财务软件中使用此计算来决定分配给不同投资组合的合同数量,因此在2或3之间进行决定非常重要。我更关心的是正确的计算而不是速度。


奇怪的是,如果你把它都写在一行上,结果是2.5。

如果精确性是基本的(财务计算),您应该明确地使用小数。您可以使用Math.Round(myDecimalValue, signesAfterDecimalPoint)String.Format("{0:0.00}", myDecimalValue)打印四舍五入的十进制数,但要使用精确的数字进行计算。否则双倍就可以了。