C#浮点运算与类型转换异常:2.3*100转int为何得到229?
C#浮点运算转int的异常原因与解决方法
问题代码
static void Main(string[] args) { int d0 = (int)(2.300000000000001 * 100D); int d1 = (int)(2.3000 * 100D); Console.WriteLine(d0); Console.WriteLine(d1); return; }
原因解释
double属于二进制浮点类型,无法精确表示所有十进制小数。2.3000这个值在内存中实际存储的是一个略小于2.3的近似值,当乘以100后,结果会变成略小于230的数(比如229.99999999999997)。而(int)强制转换会直接截断小数部分,因此得到229。
相反,2.300000000000001的二进制近似值反而更接近真实的2.3,乘以100后结果略大于等于230,截断后得到预期的230。
解决方法
- 使用四舍五入转换:用
Math.Round()先对浮点结果做四舍五入,再转int:int d1 = (int)Math.Round(2.3000 * 100D); - 改用decimal类型:
decimal是十进制浮点类型,能精确表示十进制小数,避免二进制浮点的精度误差:int d1 = (int)(2.3000m * 100m); - 使用Convert.ToInt32():该方法内部会对浮点值进行四舍五入后转换:
int d1 = Convert.ToInt32(2.3000 * 100D);
内容的提问来源于stack exchange,提问作者ZentiumX
相关产品推荐
相关产品推荐

