//函数功能:
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类型。
