技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
今天做项目,各种切小数点,金融中可能用的不是4舍5入,可能是4舍6入5成双.
1.关于截取小数点第几位(保留几位小数,非4舍5入),直接舍去
用下面的方法可以实现,一个方法,一个重载方法
public static decimal CutDecimalWithN(decimal d, int n)
{
string strDecimal = d.ToString();
int index = strDecimal.IndexOf(".");
if (index == -1 || strDecimal.Length < index + n + 1)
{
strDecimal = string.Format("{0:F" + n + "}", d);
}
else
{
int length = index;
if (n != 0)
{
length = index + n + 1;
}
strDecimal = strDecimal.Substring(0, length);
}
return Decimal.Parse(strDecimal);
}
public static decimal CutDecimalWithN(decimal? d, int n)
{
if (d==null) {
return Decimal.MinValue;
}
return CutDecimalWithN(Convert.ToDecimal(d), n);
}
2. decimal.Round 四舍五入和银行家算法的(四舍六入五成双)
decimal.Round(xx, decimalPos, MidpointRounding.ToEven);
VS
decimal.Round(xx, decimalPos, MidpointRounding.AwayFromZero);
AwayFromZero, 就是常用的四舍五入.
ToEven, 就比较特别了,称为就近舍入或四舍六入五成双
e.g.
22.333 to 22.33
22.335 to 22.34
22.325 to 22.32
22.336 to 22.34
22.326 to 22.33
后面是5的情况比较特殊,如果前面是奇数,则升上去,反之,则截掉,在金融结算中,经常使用该方法,来平衡双方的盈亏