C#从4到x2B的十进制四舍五入;小数点到2

C#从4到x2B的十进制四舍五入;小数点到2,c#,rounding,C#,Rounding,我有一个小数30.1645m,通过普通数学应该四舍五入到30.17,但它不是通过math.Round或decimal.Round以C#的方式四舍五入的。这对我来说真的很奇怪。谁能给我解释一下和/或提供一个解决方案吗?你所看到的就是所谓的银行家取整。它在IEEE 754中有定义,也在MSDN参考中有说明。当你考虑正负数时,这个方法没有偏差。 另请参见您所看到的被称为银行家舍入。它在IEEE 754中有定义,也在MSDN参考中有说明。当你考虑正负数时,这个方法没有偏差。 另请参见如果您希望始终进行取

我有一个小数30.1645m,通过普通数学应该四舍五入到30.17,但它不是通过math.Round或decimal.Round以C#的方式四舍五入的。这对我来说真的很奇怪。谁能给我解释一下和/或提供一个解决方案吗?

你所看到的就是所谓的银行家取整。它在IEEE 754中有定义,也在MSDN参考中有说明。当你考虑正负数时,这个方法没有偏差。


另请参见

您所看到的被称为银行家舍入。它在IEEE 754中有定义,也在MSDN参考中有说明。当你考虑正负数时,这个方法没有偏差。


另请参见

如果您希望始终进行取整,可以使用以下方法:

public static double RoundUp(double input, int places)
{
    double multiplier = Math.Pow(10, Convert.ToDouble(places));
    return Math.Ceiling(input * multiplier) / multiplier;
}
用法:

Decimal d = 30.1645m;
decimal d2=RoundUp(d, 2); //Result: 30.17

改编自

如果您希望始终进行汇总,可以使用以下方法:

public static double RoundUp(double input, int places)
{
    double multiplier = Math.Pow(10, Convert.ToDouble(places));
    return Math.Ceiling(input * multiplier) / multiplier;
}
用法:

Decimal d = 30.1645m;
decimal d2=RoundUp(d, 2); //Result: 30.17

改编自

30.1645m在普通数学中不转换为30.17:)由于点后的第三位数字小于5,因此应转换为30.16

您可以使用以下代码来表示所需的内容(将小数点四舍五入到小数点后的两位数)


30.1645m在普通数学中不转换为30.17:)由于点后的第三位数字小于5,因此应转换为30.16

您可以使用以下代码来表示所需的内容(将小数点四舍五入到小数点后的两位数)


在你的例子中,你可以乘以100,对新的数字进行上限运算,然后除以100


如果情况并非总是如此,您可以使用一个参数,根据您希望在操作后保留的小数位数,告诉您要使用的10的幂。

在您的情况下,您可以乘以100,对新数字执行上限,然后除以100


如果情况并非总是如此,您可以使用一个参数,根据操作后要保留的小数位数,告诉您要使用的10的幂。

您必须了解舍入的工作原理,数字30.1645将舍入为30.16,而不是您所说的30.17,因为舍入算术逻辑舍入到下一个大于或等于小数点后5位的十进制数,这意味着在数字0.1645中,4将舍入到0,因为它小于5,如果30.1655的数字将舍入到30.17,这就是为什么四舍五入在算术上是有效的

static void Main(string[] args)
        {
            decimal originalValue = 30.1645M;
            Console.WriteLine(originalValue.ToString());

            // straight forward rounding 
            decimal roundedValue = Math.Round(originalValue, 2);
            Console.WriteLine(roundedValue.ToString());

            Console.ReadKey();
        }

您必须了解舍入的工作原理,数字30.1645将舍入为30.16,而不是您所说的30.17,因为舍入算术逻辑舍入到下一个大于或等于小数点后5位的十进制数,这意味着在数字0.1645中,4将舍入到0,因为它小于5,如果30.1655的数字将舍入到30.17,这就是为什么四舍五入在算术上是有效的

static void Main(string[] args)
        {
            decimal originalValue = 30.1645M;
            Console.WriteLine(originalValue.ToString());

            // straight forward rounding 
            decimal roundedValue = Math.Round(originalValue, 2);
            Console.WriteLine(roundedValue.ToString());

            Console.ReadKey();
        }

应该四舍五入到
30.16
…据我所知,您提供的数字应该四舍五入到30.16,因为小数点后的第三位数字小于5。不
Math.round(d,2,中点舍入.ToEven)工作?正如他们告诉你的,这个数字是30.16。我投票结束这个问题,因为OP的困惑不是关于编程,而是关于初等数学。@drajvver:计算税收的正确方法是:1。小计四舍五入。2.使用四舍五入小计计算税款。3.税的四舍五入。4.总额为四舍五入小计加上四舍五入税费。无论舍入规则有多混乱,在舍入前加入税收都无法得到相同的结果。对于增值税(向客户显示的价格已经包含税),请确保除以
(1.0+税)
,而不是乘以
(1.0-税)
。。。这个错误将产生与您看到的相同类型的小错误。应该四舍五入到
30.16
…据我所知,您提供的数字应该四舍五入到30.16,因为小数点后的第三位数字小于5。不
Math.round(d,2,middpointrounding.ToEven)工作?正如他们告诉你的,这个数字是30.16。我投票结束这个问题,因为OP的困惑不是关于编程,而是关于初等数学。@drajvver:计算税收的正确方法是:1。小计四舍五入。2.使用四舍五入小计计算税款。3.税的四舍五入。4.总额为四舍五入小计加上四舍五入税费。无论舍入规则有多混乱,在舍入前加入税收都无法得到相同的结果。对于增值税(向客户显示的价格已经包含税),请确保除以
(1.0+税)
,而不是乘以
(1.0-税)
。。。这个错误会产生和你看到的一样的小错误。这不是银行家的舍入。中点规则在这里甚至不适用,因为输入不在中点上。请在投票前查看MSDN文档。它表示“四舍五入到最近,或银行家四舍五入”。。。“默认情况下,舍入方法使用舍入到最接近的约定。”另请参见哦,对不起,您描述的是函数的功能,而不是OP要求的功能。@BenVoigt他要求“这对我来说真奇怪。有人能解释和/或提供解决方案吗?”我想我已经解释过了。这不是银行家舍入。中点规则在这里甚至不适用,因为输入不在中点上。请在投票前查看MSDN文档。它表示“四舍五入到最近,或银行家四舍五入”。。。“默认情况下,舍入方法使用舍入到最接近的约定。”另请参见哦,对不起,您描述的是函数的功能,而不是OP要求的功能。@BenVoigt他要求“这对我来说真的很奇怪。有人能解释和/或为我提供解决方案吗”我想我是