`
longhua2003
  • 浏览: 13443 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

经典错误, Python小数比较

阅读更多
先看一段代码:
            print 'hu=',hu
            print 'hm=',hm

            FC = float(hm[1])-float(hm[0])
            FA = float(hm[2])-float(hm[0])
            FD = float(hm[3])-float(hm[0])
            GE = float(hm[6])-float(hm[4])
             
            Real_Date=[FC,FA,FD,GE]
            print 'FC =',FC,' FA =',FA,' FD=',FD,' GE=',GE 
            wt = 0       
            for x in xrange(len(Real_Date)):                          

                if(float(Real_Date[x]) != float(dbFileDate[x])):                             
                    print Real_Date[x],' break ',float(dbFileDate[x])
                    wt = 2
                    break             
            return wt
Real_Date的数据与dbFileDate数据是从文件中取到的:





按理来说,以上代码从这两个文件中取得数据,再去对比,肯定没有什么问题。

但是,一运行就是有问题,程序对比245.0与245.0就判定为不相等了。



当时,搞的我蒙,怎么会这样,浮点型与浮点型可以啊:




结果是


后来,我又这样写,转成整数比较吧
            for x in xrange(len(Real_Date)):                          
                Db_X = int(float(Real_Date[x]) * 1000)
                print 'Db_X',Db_X
                Db_Y = int(float(dbFileDate[x]) * 1000)
                print ' Db_Y ',Db_Y
                if (Db_X != Db_Y):                 
                    print Real_Date[x],' break ',float(dbFileDate[x])
                    print Db_X,' int ',Db_Y
                    wt = 2
                    break

结果同样让你心碎




转成int后,精度丢失了,245.0变成了249.9999,打了这么多年仗,我第一次感觉到这么无奈,这样折腾2,3个小时,算了,先出去走走吧,走到了外面,突然,我想到一个问题,Python的代码是用utf-8,而我的系统是XP,XP的默认编码是gbk,会不会因为这样的原因呢?
程序指定了utf-8


我马上修改了一下程序,把从文件中读取的数据全部转成utf-8
           wt = 0
            for x in xrange(len(Real_Date)):
                x11 =str(Real_Date[x]).decode('utf-8').encode('utf-8')
                x12 = float(x11)
                y11 = dbFileDate[x].decode('utf-8').encode('utf-8')
                y12 = float(y11)
                print x12," == ",y12             
                if(x12 != y12):
                    print x12,' break ',y12       
                    wt = 2
                    break
一运行程序,完美解决:


归根到底,就是因为编码问题造成的
  • 大小: 9.6 KB
  • 大小: 42.8 KB
  • 大小: 26.5 KB
  • 大小: 8.5 KB
  • 大小: 11.3 KB
  • 大小: 31.4 KB
  • 大小: 12.9 KB
  • 大小: 25.2 KB
分享到:
评论
2 楼 longhua2003 2014-10-23  
hwwh1999 写道
居然跟我一样搞Genesis的... 也用python!

你在那家公司工作啊
1 楼 hwwh1999 2014-10-21  
居然跟我一样搞Genesis的... 也用python!

相关推荐

    python数字操作

    但需要注意的是,结果包含的小数位数可能是不确定的: 0.2+0.1 # 0.30000000000000004 使用函数 str() 避免类型错误 当数字和字符在一起时要注意之间的转化: age = 1996 s = "我出生于" + str(age) + "年" print(s...

    python3 小数位的四舍五入(用两种方法解决round 遇5不进)

    n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。 >>> round(2.3) 2 >>> round(2.45, 1) 2.5 特殊情况 上面的结果并没有错误,这里再用2.675测试一下: >>> round(2.675, 2) 2.67 显然结果不符合四舍五...

    Python中的浮点数原理与运算分析

    本文实例讲述了Python中的浮点数原理与运算。...之所以会出现以上的结果,在于 Python (更准确地说是计算机硬件体系结构)对浮点数的表示,我们来看计算机(基于二进制)对十进制小数 0.1 的表示,十进制小数向二

    《中国电子学会青少年编程Python》2022年3月5级题目及答案

    1. 下面有关random的常用方法,描述错误的是? ( )   A.  random.random()生成一个[0.0,1.0)之间的随机小数 B.  random.randint(a,b)生成一个[a,b]之间的随机整数 C.  random.choice(seq)从序列中随机选择一个...

    Python数据类型之列表和元组的方法实例详解

    把所有开销物品名称写进去,但是问题来了,如果你发现你记录错误了,想删除掉某件物品的名称,那你是不是要在这个长字符串中去查找到,然后删除,这样虽然可行,那是不是比较麻烦呢。 这种情况下,你是不是需要...

    Random 在 Python 中的使用方法

    错误: 4.random.choice(元祖/列表/range()/字符串):  会从给定的元祖/列表/range()/字符串 中随机挑选出一个元素:(由于该操作不会对给定对象中的元素进行修改,所以对象类型可以是不可变类型,例如元祖和

    Gauss列主元消去法求解线性方程组

    printf("\n错误,Gauss列主元消去法无法忍受,在%d步退出!\n",k+1); printf("还要再计算其他的么(Y/N)?"); scanf("%c",&choice); if(choice=='Y' || choice=='y')/*判断用户输入*/ goto loop; else return; ...

    broadwell_multiplication:CC ++ asm中的低级大整数算术子例程,已针对Broadwell和Zen2 CPU进行了优化

    toom22_deg2_broadwell()相较于gmpn_toom22_mul() ,k gmpn_toom22_mul()数的乘法速度更快,其中k为2的小数。 状态 工作正在进行中。 代码需要清理。 某些子例程可能无法按预期工作。 但是,如果发布了该过程的基准...

    calculadora-metodo-simplex

    软件验证小数位数,小数点后,相反的字符,默认的空位,大多数的错误。 确认有效期后,您可以在holgura上查阅底稿和最新资料,并请参考相应的变量。 可以计算出成本,成本和收入之间的差异。 禁止再入境的禁酒令,...

    第十二节 图像处理之霍夫检测圆

    如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。 circles参数表示检测到的圆的输出向量,向量内第一个元素是圆的横坐标,第二个是纵坐标,第三个是半径...

    freemarker总结

    FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值 的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,...

Global site tag (gtag.js) - Google Analytics