为什么MidpointRounding.AwayFromZero和MidpointRounding.ToEven做同样的事情?

时间:2016-01-18 15:37:41

标签: c# .net math rounding-error

我遇到了一个相当讨厌的问题。

假设我有小数点数2.5,我想将它四舍五入。 我所有的研究都告诉我:

Math.Round(2.5, 0, MidpointRounding.AwayFromZero)

会给我想要的结果。

然而,当完全尝试那段代码时,它会返回2,而不是3。 它甚至可以在一个空白的控制台应用程序中执行,因为我不确定是否有其他东西可能会干扰它。

我在这里误解了什么吗?基本上我只是希望我给它的数字一直在四舍五入。

3 个答案:

答案 0 :(得分:2)

您想使用AwayFromZero。如果一个数字在两个整数之间结束,如1.5,它将舍入到2.否则,舍入将正常发生。

Here是文档。

如果您想要总是向上舍入,请使用Math.Ceiling(my_double);

答案 1 :(得分:2)

您在评论中提到了complexType1

假设int为正数,最有效的方法就是:

convert an int to half it's value, always rounded up

如果您需要处理正值和负值,

int result = (value+1)/2;

答案 2 :(得分:0)

找出解决方案:

基本上在我的代码中我从输入字段中检索一个int,它默认被转换为int,所以当我将它减半时,它会自动向下舍入(例如,5/2 = 2,而不是2.5正如我所料。)

解决方案是将输入数字转换为小数。

带有更正的代码段:

// strong is the input value
decimal calc = (decimal)strong / 2;

// targetInput is the input field for the result
targetInput.text = (Math.Round(calc, 0, MidpointRounding.AwayFromZero)).ToString();

对不起,如果我浪费了任何时间。