Eoi*_*ell 583

以下是一些例子:

decimal a = 1.994444M;

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

decimal b = 1.995555M;

Math.Round(b, 2); //returns 2.00
Run Code Online (Sandbox Code Playgroud)

您可能还希望看看银行家四舍五入/舍入到以下过载:

Math.Round(a, 2, MidpointRounding.ToEven);
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该澄清MidPointRounding.ToEven是默认值.如果你想要AwayFromZero,你将不得不使用重载 (47认同)
  • 如果你想**向上舍入**到2位小数,请在舍入前将数字加上"0.005".同样地向**舍入**,在传递给`Math.Round`函数之前减去`0.005`. (4认同)
  • .NET默认为"MidPointRounding.ToEven"(又名"Bankers Rounding")的原因是因为我们都学会在学校里进行四舍五入.5轮向上导致过多的四舍五入.在处理金钱,税收计算等时,这是一个问题. (4认同)

Joh*_*ker 89

试试这个:

twoDec = Math.Round(val, 2)
Run Code Online (Sandbox Code Playgroud)


Gle*_*eno 33

就个人而言,我永远不会圆.保持尽可能坚决,因为无论如何,舍入在CS中都是一个红色的鲱鱼.但您确实希望为用户格式化数据,为此,我发现这string.Format("{0:0.00}", number)是一种很好的方法.

  • @FrenkyB当你说'方括号'时,我希望你的意思是大括号. (7认同)

Col*_*nic 29

如果你想要一个字符串

> (1.7289).ToString("#.##")
"1.73"
Run Code Online (Sandbox Code Playgroud)

或小数

> Math.Round((Decimal)x, 2)
1.73m
Run Code Online (Sandbox Code Playgroud)

但要记住!舍入不是分配的,即.round(x*y) != round(x) * round(y).因此,在计算结束之前不要进行任何舍入,否则你将失去准确性.


For*_*ker 14

维基百科有一个关于四舍五入的好页面.

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

您也可以使用自定义数字格式进行舍入.

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

这是银行家舍入算法的有用位置.看看雷蒙德在这里关于四舍五入的幽默帖子之一......


Rae*_*Lee 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
Run Code Online (Sandbox Code Playgroud)

=========

// 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"
Run Code Online (Sandbox Code Playgroud)

也可以将"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"
Run Code Online (Sandbox Code Playgroud)

  • String.Format("{0:0.00}", 140.6767554); != "140.67" 它实际上呈现为 "140.68" - 向上取整 (2认同)

小智 8

如果您想对一个数字进行四舍五入,您可以获得不同的结果,具体取决于:您如何使用 Math.Round() 函数(如果是向上取整或向下取整),您正在使用双精度数和/或浮点数,然后应用中点舍入。特别是,当在其中使用 with 操作或要舍入的变量来自操作时。假设您想将这两个数字相乘: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
Run Code Online (Sandbox Code Playgroud)

如您所见,如果您想向下舍入中点,第一个 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
Run Code Online (Sandbox Code Playgroud)

因此,恕我直言,您应该为符合您要求的 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Riy*_*eed 7

有一个奇怪的情况,我有一个十进制变量,当序列化 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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

用法应该是

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

decimal sampleDecimalValueV1 = 2;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());
Run Code Online (Sandbox Code Playgroud)

输出:

2.50
2.00
Run Code Online (Sandbox Code Playgroud)


Guy*_*Guy 6

我知道这是一个老问题,但请注意Math RoundString格式之间的以下区别:

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"
Run Code Online (Sandbox Code Playgroud)


小智 5

这是为了在C#中舍入到2位小数:

label8.Text = valor_cuota .ToString("N2") ;
Run Code Online (Sandbox Code Playgroud)

在VB.NET中:

 Imports System.Math
 round(label8.text,2)
Run Code Online (Sandbox Code Playgroud)