我会使用
Math.Round
函数来完成这个操作。你可能需要检查Math.Round的舍入机制:
http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
除此之外,我建议使用Math.Round(inputNumer, numberOfPlaces)方法而不是*100/100的方法,因为它更简洁。
Math.Floor(123456.646 * 100) / 100 会返回 123456.64
Math.Round()
可以解决这个问题,并通过向方法传递precision
参数和MidpointRounding
参数来适应不同的情况。Math.Round
使用的是MidpointRounding.ToEven
,实际上是指银行家舍入法
,即四舍五入到最近的偶数。1.5 => 2
2.5 => 2
3.5 => 4
4.5 => 4
让我来澄清一下。实际上,你可以采用五种策略之一来获取你从 Math.Round()
中期望得到的结果:
ToEven (默认) 当一个数恰好处于两个其他数的中间时,它会被舍入为最接近的偶数。
AwayFromZero (数学舍入) 当一个数恰好处于两个其他数的中间时,它会被舍入为离零最远的数。(也就是四舍五入)
ToZero 根据指定的精度向下舍入该数。
ToNegativeInfinity (取整) 根据指定的精度向下舍入该数。
ToPositiveInfinity (取整) 根据指定的精度向上舍入该数。
以下是代码,可以了解它们的工作原理:
var num1 = 1.5;
var num2 = 2.5;
var num3 = 3.5;
var num4 = 2.51;
var num5 = 2.48;
Console.WriteLine("----------------Round with MidpointRounding.ToEven (default) ---------------------");
Console.WriteLine($"{num1} => {Math.Round(num1, MidpointRounding.ToEven)}");
Console.WriteLine($"{num2} => {Math.Round(num2, MidpointRounding.ToEven)}");
Console.WriteLine($"{num3} => {Math.Round(num3, MidpointRounding.ToEven)}");
Console.WriteLine($"{num4} => {Math.Round(num4, MidpointRounding.ToEven)}");
Console.WriteLine($"{num5} => {Math.Round(num5, MidpointRounding.ToEven)}");
Console.WriteLine("----------------Round with MidpointRounding.AwayFromZero (mathematical rounding) ---------------------");
Console.WriteLine($"{num1} => {Math.Round(num1, MidpointRounding.AwayFromZero)}");
Console.WriteLine($"{num2} => {Math.Round(num2, MidpointRounding.AwayFromZero)}");
Console.WriteLine($"{num3} => {Math.Round(num3, MidpointRounding.AwayFromZero)}");
Console.WriteLine($"{num4} => {Math.Round(num4, MidpointRounding.AwayFromZero)}");
Console.WriteLine($"{num5} => {Math.Round(num5, MidpointRounding.AwayFromZero)}");
Console.WriteLine("----------------Round with MidpointRounding.ToZero ---------------------");
Console.WriteLine($"{num1} => {Math.Round(num1, MidpointRounding.ToZero)}");
Console.WriteLine($"{num2} => {Math.Round(num2, MidpointRounding.ToZero)}");
Console.WriteLine($"{num3} => {Math.Round(num3, MidpointRounding.ToZero)}");
Console.WriteLine($"{num4} => {Math.Round(num4, MidpointRounding.ToZero)}");
Console.WriteLine($"{num5} => {Math.Round(num5, MidpointRounding.ToZero)}");
Console.WriteLine("----------------Round with MidpointRounding.ToNegativeInfinity (floor) ---------------------");
Console.WriteLine($"{num1} => {Math.Round(num1, MidpointRounding.ToNegativeInfinity)}");
Console.WriteLine($"{num2} => {Math.Round(num2, MidpointRounding.ToNegativeInfinity)}");
Console.WriteLine($"{num3} => {Math.Round(num3, MidpointRounding.ToNegativeInfinity)}");
Console.WriteLine($"{num4} => {Math.Round(num4, MidpointRounding.ToNegativeInfinity)}");
Console.WriteLine($"{num5} => {Math.Round(num5, MidpointRounding.ToNegativeInfinity)}");
Console.WriteLine("----------------Round with MidpointRounding.ToPositiveInfinity (ceiling) ---------------------");
Console.WriteLine($"{num1} => {Math.Round(num1, MidpointRounding.ToPositiveInfinity)}");
Console.WriteLine($"{num2} => {Math.Round(num2, MidpointRounding.ToPositiveInfinity)}");
Console.WriteLine($"{num3} => {Math.Round(num3, MidpointRounding.ToPositiveInfinity)}");
Console.WriteLine($"{num4} => {Math.Round(num4, MidpointRounding.ToPositiveInfinity)}");
Console.WriteLine($"{num5} => {Math.Round(num5, MidpointRounding.ToPositiveInfinity)}");
结果:
----------------Round with MidpointRounding.ToEven (default) ---------------------
1.5 => 2
2.5 => 2
3.5 => 4
2.51 => 3
2.48 => 2
----------------Round with MidpointRounding.AwayFromZero (mathematical rounding) ---------------------
1.5 => 2
2.5 => 3
3.5 => 4
2.51 => 3
2.48 => 2
----------------Round with MidpointRounding.ToZero ---------------------
1.5 => 1
2.5 => 2
3.5 => 3
2.51 => 2
2.48 => 2
----------------Round with MidpointRounding.ToNegativeInfinity ---------------------
1.5 => 1
2.5 => 2
3.5 => 3
2.51 => 2
2.48 => 2
----------------Round with MidpointRounding.ToPositiveInfinity ---------------------
1.5 => 2
2.5 => 3
3.5 => 4
2.51 => 3
2.48 => 3
string a = "10.65678";
decimal d = Math.Round(Convert.ToDouble(a.ToString()),2)
将字符串a转换为双精度浮点数,并将其四舍五入至小数点后两位,结果存储在变量d中。 public double RoundDown(double number, int decimalPlaces)
{
return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}