将小数点后四舍五入到小数点后两位

时间:2020-06-17 23:15:20

标签: c# rounding

我在将数字四舍五入到小数点后两位时遇到问题。

我的电话号码是3106.4647771976413339683766317M。

正确舍入到小数点后两位是3106.47,但是使用Math.Round(value, 2, MidpointRounding.AwayFromZero)的数字是3106.46。

问题在于方法将小数点后第三位四舍五入,但是如果将小数点后第四位四舍五入,则会生成正确的数字。

有人有类似的东西吗?

2 个答案:

答案 0 :(得分:3)

从数学上讲,正确舍入到小数点后两位 3106.46。

您可能想要的是天花板

Math.Ceiling(3106.4647771976413339683766317M * 100) / 100

产生3106.47。没有Math.Ceiling版本接受小数位数,这就是为什么存在乘法和除法的原因。

此外,请注意此表达式中有一个警告:

Math.Round(value, 2, MidpointRounding.AwayFromZero) 

Math.Round没有带有三个参数的变体,其中第一个是decimal。之所以有效,是因为该值被隐式转换为double。但是,这是不需要的。

答案 1 :(得分:0)

如果您真的想四舍五入(比起传统意义上的实际四舍五入来说,是更多的常见错误),则可以从最右边的数字向上取整,然后一次向左移动一位。

double numberToRound = 3106.4647771976413339683766317;

int placesToRoundTo = 2;
int smallestPlaceIndex = 24; // you would need to determine this value

for (int i = smallestPlaceIndex; i >= placesToRoundTo)
{
    numberToRound = Math.Round(numberToRound, i, MidpointRounding.AwayFromZero);
}

没有一个简单的内置方法可以执行此操作,因为它不是正常的舍入。