这应该很简单,但我找不到内置方法,.net框架必须有一个方法来执行此操作!
private decimal RoundDownTo2DecimalPlaces(decimal input)
{
if (input < 0)
{
throw new Exception("not tested with negitive numbers");
}
// There must be a better way!
return Math.Truncate(input * 100) / 100;
}
答案 0 :(得分:15)
如果您将向下四舍五入,则需要:
Math.Floor(number * 100) / 100;
如果你正在寻找一种叫做“银行家四舍五入”的东西(可能不是用于输出而不是用于统计/求和),那么:
Math.Round(number, 2);
最后如果你想,不确定正确的术语是什么,'正常舍入':
Math.Round(number, 2, MidpointRounding.AwayFromZero);
答案 1 :(得分:6)
如果要向下舍入值,请使用Math.Floor;如果要获得精确回合,请使用Math.Round。 Math.Truncate只是删除数字的小数部分,所以你得到负数的坏结果:
var result= Math.Floor(number * 100) / 100;
Math.Floor始终返回比指定值更小(Floor)或更大(Ceiling)的最小整数值。所以你没有得到正确的舍入。例如:
Math.Floor(1.127 * 100) / 100 == 1.12 //should be 1.13 for an exact round
Math.Ceiling(1.121 * 100) / 100 == 1.13 //should be 1.12 for an exact round
始终更喜欢包含中点舍入参数的Math.Round版本。该参数指定如何将中点值(5)作为最后一位数处理。
如果您没有指定AwayFromZero作为param的值,您将获得默认行为,即ToEven。 例如,使用ToEven作为舍入方法,您将获得:
Math.Round(2.025,2)==2.02
Math.Round(2.035,2)==2.04
相反,使用MidPoint.AwayFromZero param:
Math.Round(2.025,2,MidpointRounding.AwayFromZero)==2.03
Math.Round(2.035,2,MidpointRounding.AwayFromZero)==2.04
因此,对于正常的舍入,最好使用此代码:
var value=2.346;
var result = Math.Round(value, 2, MidpointRounding.AwayFromZero);
答案 2 :(得分:3)
使用.Truncate()
获取确切金额,或使用.Round()
进行四舍五入。
decimal dNum = (decimal)165.6598F;
decimal dTruncated = (decimal)(Math.Truncate((double)dNum*100.0) / 100.0); //Will give 165.65
decimal dRounded = (decimal)(Math.Round((double)dNum, 2)); //Will give 165.66
或者您可以使用扩展方法来运行它,如dNum.ToTwoDecimalPlaces();
public static class Extensions
{
public static decimal ToTwoDecimalPlaces(this decimal dNum)
{
return ((decimal)(Math.Truncate((double)dNum*100.0) / 100.0));
}
}
答案 3 :(得分:2)
Math.Floor(number * 100) / 100;
答案 4 :(得分:0)
.net框架中没有构建方法来执行此操作,其他答案说明如何编写自己的代码。