我在将数字四舍五入到小数点后两位时遇到问题。
我的电话号码是3106.4647771976413339683766317M。
正确舍入到小数点后两位是3106.47,但是使用Math.Round(value, 2, MidpointRounding.AwayFromZero)
的数字是3106.46。
问题在于方法将小数点后第三位四舍五入,但是如果将小数点后第四位四舍五入,则会生成正确的数字。
有人有类似的东西吗?
答案 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);
}
没有一个简单的内置方法可以执行此操作,因为它不是正常的舍入。