如何在C#中将数字四舍五入到小数点后两位?


Answers:


629

这里有一些例子:

decimal a = 1.994444M;

Math.Round(a, 2); //returns 1.99

decimal b = 1.995555M;

Math.Round(b, 2); //returns 2.00

您可能还想看看具有以下重载的银行家四舍五入/四舍五入:

Math.Round(a, 2, MidpointRounding.ToEven);

有一个关于它的更多信息在这里


51
您应该阐明MidPointRounding.ToEven是默认设置。如果您想要AwayFromZero,则必须使用重载
Brian Vander Plaats,2009年

5
如果要四舍五入至小数点两位,请添加0.005在四舍五入之前将数字。同样舍入0.005在传递给Math.Round函数之前先减去。
orad 2015年

4
.NET默认为MidPointRounding.ToEven(也称为“银行家四舍五入”)的原因是因为我们都学会了在.5向上舍入的学校中进行舍入导致太多的舍入。在处理货币,税款计算等问题时,这是一个问题
。– asporter


33

我个人从来没有四舍五入。尽可能保持坚决,因为无论如何,舍入在CS中都是一个红色的鲱鱼。但是您确实想为用户格式化数据,为此,我发现这string.Format("{0:0.00}", number)是一个很好的方法。


这对于显示目的尤其是钱更有效,因为5.4英镑(使用Math.round)看起来不如5.4英镑(这种方式)。
彼得·戈登

我已经尝试过string.Format(“ 0:0.00”,number),但是没有用。这些方括号非常重要,因此:string.Format(“ {0:0.00}”,number)有效。
FrenkyB 2015年

8
@FrenkyB当您说“方括号”时,我希望您的意思是大括号。
Mathemats

此回合也。1.009 => 1.01
Donny V.

30

如果你想要一个字符串

> (1.7289).ToString("#.##")
"1.73"

或小数点

> Math.Round((Decimal)x, 2)
1.73m

但要记住!舍入不是分布式的,即。round(x*y) != round(x) * round(y)。因此,在计算结束之前不要进行任何四舍五入,否则会丢失准确性。


14

总体而言,维基百科上有一个很好的四舍五入页面

所有.NET(托管)语言都可以使用任何公共语言运行时(CLR)舍入机制。例如,Math.Round()(如上所述)方法允许开发人员指定舍入类型(四舍五入或零舍入)。Convert.ToInt32()方法及其变体使用round-to-even。该天花板()地面()方法是相关的。

您也可以采用自定义数字格式

注意Decimal.Round()使用的方法与Math.Round()不同;

这是关于银行家四舍五入算法的一个有用的观点在此处查看有关雷蒙德的幽默文章之一...


13

//最多转换两位小数

String.Format("{0:0.00}", 140.6767554);        // "140.67"
String.Format("{0:0.00}", 140.1);             // "140.10"
String.Format("{0:0.00}", 140);              // "140.00"

Double d = 140.6767554;
Double dc = Math.Round((Double)d, 2);       //  140.67

decimal d = 140.6767554M;
decimal dc = Math.Round(d, 2);             //  140.67

=========

// just two decimal places
String.Format("{0:0.##}", 123.4567);      // "123.46"
String.Format("{0:0.##}", 123.4);         // "123.4"
String.Format("{0:0.##}", 123.0);         // "123"

也可以将“ 0”与“#”组合在一起。

String.Format("{0:0.0#}", 123.4567)       // "123.46"
String.Format("{0:0.0#}", 123.4)          // "123.4"
String.Format("{0:0.0#}", 123.0)          // "123.0"

1
String.Format(“ {0:0.00}”,140.6767554); !=“ 140.67”实际上表示为“ 140.68”-四舍五入
AndyT

7

我知道这是一个古老的问题,但是请注意以下数学回合字符串格式回合之间的区别:

decimal d1 = (decimal)1.125;
Math.Round(d1, 2).Dump();   // returns 1.12
d1.ToString("#.##").Dump(); // returns "1.13"

decimal d2 = (decimal)1.1251;
Math.Round(d2, 2).Dump();   // returns 1.13
d2.ToString("#.##").Dump(); // returns "1.13"

6

这是在C#中舍入到小数点后2位:

label8.Text = valor_cuota .ToString("N2") ;

在VB.NET中:

 Imports System.Math
 round(label8.text,2)

5

如果要四舍五入,可以根据以下方式获得不同的结果:使用Math.Round()函数的方式(如果是向上舍入或向下舍入),则使用双精度和/或浮点数,然后应用中点舍入。特别是,在其内部使用操作或要舍入的变量来自操作时。假设您要将这两个数字相乘:0.75 * 0.95 = 0.7125。对?不在C#中

让我们看看如果要四舍五入到小数点后第三位会发生什么:

double result = 0.75d * 0.95d; // result = 0.71249999999999991
double result = 0.75f * 0.95f; // result = 0.71249997615814209

result = Math.Round(result, 3, MidpointRounding.ToEven); // result = 0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = 0.712. Should be 0.713

如您所见,如果要舍入中点,则第一个Round()是正确的。但是第二轮Round(),如果您想四舍五入是错误的。

这适用于负数:

double result = -0.75 * 0.95;  //result = -0.71249999999999991
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = -0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = -0.712. Should be -0.713

因此,恕我直言,您应该为Math.Round()创建适合您需求的包装函数。我创建了一个函数,参数'roundUp = true'表示舍入到下一个更大的数字。即:0.7125舍入为0.713,-0.7125舍入为-0.712(因为-0.712> -0.713)。这是我创建的函数,适用于任意数量的小数:

double Redondea(double value, int precision, bool roundUp = true)
{
    if ((decimal)value == 0.0m)
        return 0.0;

    double corrector = 1 / Math.Pow(10, precision + 2);

    if ((decimal)value < 0.0m)
    {
        if (roundUp)
            return Math.Round(value, precision, MidpointRounding.ToEven);
        else
            return Math.Round(value - corrector, precision, MidpointRounding.AwayFromZero);
    }
    else
    {
        if (roundUp)
            return Math.Round(value + corrector, precision, MidpointRounding.AwayFromZero);
        else
            return Math.Round(value, precision, MidpointRounding.ToEven);
    }
}

变量“校正器”用于修正浮点数或双数运算的不准确性。



3

您应该能够使用Math.Round(YourNumber,2)指定要四舍五入的位数。

您可以在这里阅读更多内容。




1

发生一种奇怪的情况,我有一个十进制变量,在序列化55.50时,它总是在数学上始终将默认值设置为55.5。但是,由于某些原因,我们的客户系统严重期望55.50,因此他们肯定期望十进制。多数民众赞成在我编写下面的帮助程序时,该帮助程序始终将填充的任何十进制值转换为带有零的2位,而不是发送字符串。

public static class DecimalExtensions
{
    public static decimal WithTwoDecimalPoints(this decimal val)
    {
        return decimal.Parse(val.ToString("0.00"));
    }
}

用法应该是

var sampleDecimalValueV1 = 2.5m;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());

decimal sampleDecimalValueV1 = 2;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());

输出:

2.50
2.00

0
  public double RoundDown(double number, int decimalPlaces)
        {
            return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
        }
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.