计算机中double类型数据运算:71.1*100 !=7110?
我们有意思的发现:double类型的数71.1乘以100以后得到的是7109.9999999999991,并不是7110。这样的问题出现在精度要求高的场景就是个大问题了,比如跟金钱相关的应用。
double temp = 71.1;
double result1= temp * 100;//结果却是7109.9999999999991;
这是为什么呢?其实这些数字在计算机中用二进制保存的,二进制就有精度问题,位数越多精度越高,16位比8位高,64位比32位高等,所以计算转换成十进制后可能会出现误差,出现无限小数的情况。
处理办法有:转为decimal数据类型做运算
double temp = 71.1;
double result2 =(double) ((decimal) temp * 100);//此时结果7110
或者用Math.Round舍为最接近的整数:
double temp = 71.1;
double result3=Math.Round(temp * 100);//此时结果7110
使用decimal或者Math.Round可尽量减少这种误差的出现,但是不知道是否能解决所有这样数据的误差。有时候放大100倍、1000倍、10000倍等做计算后再换算回来也可以提高精度。
网友评论