如何使用.NET Math.Round(<decimal>,<int>,MidpointRounding.AwayFromZero)

时间:2016-06-22 02:06:13

标签: c# .net math decimal rounding

在.NET中,为什么System.Math.Round(27.2351, 2, MidpointRounding.AwayFromZero)会产生27.24而不是27.23

第三个数字是5,所以我们检查第4个数字是否小于5,所以结果应该是27.23

有没有办法得到这个结果。

查看我的问题:

我的金额为2013.86,税金为7%。现在是2013.86 = 140.97

的7%

但是这个2013.86是我的总金额。

详细信息如下:

Amount     Tax     Tax Value in 2 decimals by Math.Round
718.37      7%      50.29
496.06      7%      34.72
384.70      7%      26.93
310.93      7%      21.77
103.80      7%      7.27
----------------------------
2013.86             140.98

总税额为140.97但个人税率为140.98 :( :( 如何将总金额税额与个人金额税额的总和相匹配。

任何建议

2 个答案:

答案 0 :(得分:3)

您对舍入的理解不正确。 27.2351比27.23更接近27.24,因此将27.2351舍入到2位小数将总是产生27.24而不管任何中点舍入选项。

中点舍入选项仅在两个选项之间的数字正好时发挥作用,即在您的情况下为27.2350000。考虑数字行:

                                        /--What to do at this exact point?
                                        |  It's not "closer" to either side!
                                        |
                                        v
.............round to 27.230............|...........round to 27.240............
<~---------------------------------------------------------------------------~>
      |                                 |                                 |
    27.230                            27.235                            27.240

至于您在编辑中遇到的行为,这是正常的。舍入数字的总和并不总是与您先对数字相加,然后再进行一次数相同。您需要了解如何为您的特定司法管辖区计算税收,然后按照这一点进行。

答案 1 :(得分:1)

首先致电System.Math.Round(27.2351, 3, MidpointRounding.AwayFromZero),应该返回27.24,因为这是2小数位的正确答案。

您也不应该使用double进行货币计算 - 请改用decimal。始终使用m后缀数字,即27.2351m而不是27.2351double)。

现在,在你提出的其他问题中,你似乎在谈论获得&#34;天花板&#34;,而不是四舍五入。

致电System.Math.Round(2013.86m * 0.07m, 2, MidpointRounding.AwayFromZero)会为您提供140.97m,但如果有一小部分分数,税款应始终上涨到最接近的分数。

所以这就是你需要的电话:

System.Math.Ceiling(2013.86m * 0.07m * 100m) / 100m

这给了140.98m