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。
如果精确性是基本的(财务计算),您应该明确地使用小数。您可以使用