在python和很多编程语言中都会发生类似的状况
这里我以python为例
结果:
0.30000000000000004这对于常规的计算似乎影响不是很大,但是如果是深度学习算法这样庞大的数据计算可能就会产生蝴蝶效应,所以我们有必要知道它背后的原因及其解决办法。
具体原因:浮点数间运算存在不确定尾数(不是BUG)
那么为什么会出现不确定尾数呢?
这涉及到了编程语言对数字运算的内部实现原理:
计算机中所有数据本质上都要用二进制来存储
以python语言为例,对于浮点数,采用53位二进制表示小数部分,约10^-16
又因为二进制和十进制之间不存在严格的对等关系,0.1在用二进制表示时实际上是个无限小数,python截取的53位来无限接近0.1
再将二进制转换为十进制,0.1在python内部以十进制表示为
d(0.1)约等于0.100000000000000055511151231257827021181583404541015625所以0.1在python中并不是准确的0.1,实际上它是一个无限接近0.1的数
进一步的,0.1和0.2相加时,计算机内部计算过程:
分别二进制转换——二进制运算——反向转换为十进制——得到一个无限接近0.3的结果
这就是浮点数运算存在不确定尾数的原因。
当我们判断尝试判断0.1+0.2是否等于0.3是答案是否定的
那么这种问题我们该如何解决呢?
解决办法:round函数
round(0.1+0.2,1) == 0.3 Trueround函数解析
round(x,d) :对x四舍五入,d是小数截取位数。 结论:浮点数间运算或者比较时用round()函数来辅助