C# float double decimal 金额舍入 区别

//函数功能:

value要转换的值

digits小数位数

 truncatetype:截取类型 全入 全舍 四舍五入

下面是原先代码

public static double ConvertDouble(double value, int digits, int truncatetype)
{
double tempPow = System.Math.Pow(10,digits);
double tempValue = value * tempPow * 10;
tempValue = System.Math.Truncate(tempValue);
tempValue /= 10;

switch(truncatetype)
{
case 1: //上取
tempValue = System.Math.Ceiling(tempValue);
break;
case 2: //下取
tempValue = System.Math.Floor(tempValue);
break;
default:
tempValue = System.Math.Round(tempValue);
break;
}

return (tempValue / tempPow);
}

 

public static float ConvertFloat(float value, int digits, int truncatetype)
{
return Convert.ToSingle(ConvertDouble(Convert.ToSingle(value), digits, truncatetype));
}

 

主要使用ConvertFloat这个函数在测试过程中发现1.8变成1.79这是两位小数。最后修正的代码


public static float ConvertFloat(float value, int digits, int truncatetype)
{
  float tempPow = Convert.ToSingle(System.Math.Pow(10, digits)); //移动小数点到digits位
  float tempValue = value * tempPow * 10.0F; //继续移动一位小数
  tempValue = Convert.ToSingle(System.Math.Truncate(tempValue)) / 10.0F; //截取后移回小数位

  switch (truncatetype) //截取
{
case 1: //上取
tempValue = Convert.ToSingle(System.Math.Ceiling(tempValue)) / tempPow;
break;
case 2: //下取
tempValue = Convert.ToSingle(System.Math.Floor(tempValue)) / tempPow;
break;
default:
tempValue = Convert.ToSingle(System.Math.Round(tempValue)) / tempPow;
break;
}

return tempValue ;
}

 

经验:原先的想法,只要将float转换为double即可

但是调试发现,1.8转换为double后变为1.7999999.....这样就出现问题。但是float类型的值大了以后可能不会出现这样的问题。因为这是单价含义,因此出现问题。

实在抱歉,又出现问题了。

在开发环境下没有任何问题,当编译成release执行的时候仍旧出现上述问题。

最后在网上http://stackoverflow.com找到一个方法,将float转换为decimal可解决问题。经过测试一切OK!

血的教训,使用金额的时候一定要使用decimal类型。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值