关于python,C++等浮点数的数据精度问题解决办法(如int(0.29*100)不等于29,3.8*3.9=14.819999999等等)

简单来说只要使用IEEE_754标准来存储浮点数的语言都存在这种问题,出现的原因就是小数在转换成二进制的过程中由于位数的限制不能完全表示这个小数导致精度丢失。

比如我想取得1.29的小数,即想要取得2和9,代码如下:

double a=0.29;
int b1=int(a*10);
int b2=a*100-b1*10;

如果没有意外应该是a=2,b=9;

但是得到的输出缺失b1=2,b2=8.

因为0.29*100=28.9999999...;因为b1和b2是int型,a*100-b1*10对a*100做了隐式转换(double->int),所以int(a*100)相当于int(28.9999999...)=28。

除了0.29之外还有一些浮点数也会出现大一点或者小一点的问题

因此可以用round()四舍五入来解决这个问题

用法如下:

double a = 0.29;
int b1 = int (a * 10);
int b2 = round(a * 100) - b1 * 10;

而round(a*100)此时便等于29。

但是这种做法适用的情况不多

更通用的做法是我们可以通过将小数转为整数去运算

下面以python为例

a=3.8

b=3.9

a*b=14.8199999999

这样结果不对,可以用以下方法解决

a1,a2=str(a).split('.')

b1,b2=str(b).split('.')

a_int=int(a1+a2)

b_int=int(b1+b2)

result=a_int*b_int/(10**(len(a2)+len(b2)))

即可得到正确结果14.82

你可能感兴趣的:(数据结构,double精度,python)