舍入小数问题

时间:2016-07-01 11:55:45

标签: c# .net decimal rounding

我在整个项目中使用十进制数据类型,相信它会给我最准确的结果。但是,我遇到了四舍五入错误正在蔓延的情况,看起来我最好不要使用双打。

我有这个计算:

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

当13 * 15/78的正确答案为2.5时,resultDecimal为2.4999999999999999。这似乎是因为tempDecimal(15/78的结果)是一个重复的十进制值。

我随后将此结果舍入到零小数位(远离零),在这种情况下我期望为3,但实际上变为2。

如果我改为使用双打:

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

然后我在resultDouble中获得2.5,这是我正在寻找的答案。

从这个例子来看,感觉我更喜欢使用双打或漂浮物,即使它们精度较低。我假设我设法得到错误的结果2.4999999999999999只是因为小数可以将结果存储到该小数位数,而双重舍入它。

我应该使用双打吗?

编辑:此计算用于财务软件,以决定将多少合同分配给不同的投资组合,因此决定2或3之间的重要性。我更关心正确的计算而不是速度。

1 个答案:

答案 0 :(得分:1)

奇怪的是,如果你把它全部写在一行上就会产生2.5。

如果精确是重要的(财务计算),你应该肯定使用小数。您可以使用Math.Round(myDecimalValue, signesAfterDecimalPoint)String.Format("{0:0.00}", myDecimalValue)打印舍入小数,但请使用确切的数字进行计算。否则双重就好了。