如何在C#中四舍五入到最接近的整数


Answers:


200

有关更多信息,请参见官方文档。例如:

基本上,给该Math.Round方法三个参数。

  1. 您要舍入的值。
  2. 您要保留在该值后面的小数位数。
  3. 您可以调用一个可选参数来使用AwayFromZero舍入。(除非四舍五入,否则忽略,例如1.5

样例代码:

var roundedA = Math.Round(1.1, 0); // Output: 1
var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2
var roundedC = Math.Round(1.9, 0); // Output: 2
var roundedD = Math.Round(2.5, 0); // Output: 2
var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3
var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3

现场演示

如果需要MidpointRounding.AwayFromZero四舍五入一个.5值,则需要。不幸的是,这不是的默认行为Math.Round()。如果使用MidpointRounding.ToEven(默认)值,则将其舍入为最接近的偶数1.5舍入为2,但2.5也舍入为2)。


14
另一方面,使用away from zero也意味着-1.5将舍入为-2
davogotland 2012年

2
使用Math.Ceiling,它不是一个很好的做法,使用Math.Round的摩擦,写着:stackoverflow.com/questions/9221205/...
亚基尔庄园

3
我发现Math.Round(1.5,0)返回2
David

@davogotland是他们将137.5舍入为140而不是138吗?我的意思是四舍五入到最接近的十分之一吗?
sam,2017年

1
@sam也许除以10,然后与Math.Ceiling取整,最后乘以10?
davogotland'3

63
Math.Ceiling

总是四舍五入(朝天花板)

Math.Floor

总是四舍五入(朝地板)

你所追求的只是

Math.Round

根据这篇文章四舍五入


反正他们是137.5到140还是138?我的意思是四舍五入到最接近的十分之一吗?
sam,2017年

7

你需要Math.Round,没有Math.CeilingCeiling总是“向上舍入”,而Round根据小数点后的值向上或向下舍入。


6

有这本手册,也有点可爱:

double d1 = 1.1;
double d2 = 1.5;
double d3 = 1.9;

int i1 = (int)(d1 + 0.5);
int i2 = (int)(d2 + 0.5);
int i3 = (int)(d3 + 0.5);

只需在任何数字上加上0.5,然后将其转换为int(或将其底数),就可以在数学上正确舍入:D


它仍然看起来可疑。首先,这个问题询问四舍五入起来,其次,当我试图刚才Math.Round(1.5)轮的默认实现2。所以这可能不是他想要的东西。
2012年

同样,您的示例将小数点与小数逗号混合。您通常使用哪一个(我猜是在瑞典)?:)
版本

糟糕...哦,对不起。当然,在编程小数点时,但在正式文本中,我们使用小数点逗号。是的,关于这个问题,瑞典语^^和“四舍五入”部分:我认为那只是一些语言错误。在op给出的示例中,一些十进制数字四舍五入。
davogotland 2012年

@ver我不舍弃Math.Round,我使用强制转换。这就是为什么这种方式手动且有点可爱的原因;)
davogotland 2012年

5

您可以按照其他人的建议使用Math.Round(推荐),也可以添加0.5并强制转换为int(这将删除小数部分)。

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2

5

只是提醒。当心双倍。

Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999
Math.Round( 1.5 ) = 2


2

这将四舍五入到最接近的5或如果已经被5整除则不变

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}

2

我一直在寻找,但我的示例是采用一个数字,例如4.2769,并将其范围降为4.3。不完全相同,但是如果这样做有帮助:

Model.Statistics.AverageReview   <= it's just a double from the model

然后:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

等等...


我使用此方法是因为我也需要一个字符串,并且.ToString(“ n0”)为我处理了四舍五入:1.5m.ToString(“ n0”)//返回“ 2”
Nathan Prather



0

如果您使用整数而不是浮点数,则采用这种方法。

#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))

这里的“ numr”“ denr”都是无符号整数。



0

编写自己的舍入方法。就像是,

function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.