python 有关小数减法精度的问题

软件和网站开发以及相关技术探讨
回复
afox800
帖子: 200
注册时间: 2009-08-02 7:44
来自: 圣彼得堡

python 有关小数减法精度的问题

#1

帖子 afox800 » 2013-07-21 17:19

:em20 python
>>> 1.31-1.0
0.31000000000000005
>>> 1.5-1
0.5
>>> 1.3-1
0.30000000000000004
>>> 1.2-1
0.19999999999999996
>>>

虽然误差很小,但是这只是普通的减法啊!!!
能不能解决啊?
mophisays
帖子: 64
注册时间: 2014-01-06 10:35
系统: xUbuntu

Re: python 有关小数减法精度的问题

#2

帖子 mophisays » 2014-05-16 16:20

现在数字计算机的框架下,浮点数计算普遍存在精度问题,
即使强大如Mathematica,或者极致如Axiom,也未能免俗。
两间东倒西歪屋
一个南腔北调人
nae6taiyie0T
帖子: 482
注册时间: 2013-09-13 0:42
系统: Debian sid

Re: python 有关小数减法精度的问题

#3

帖子 nae6taiyie0T » 2014-05-16 22:21

afox800 写了::em20 python
>>> 1.31-1.0
0.31000000000000005
>>> 1.5-1
0.5
>>> 1.3-1
0.30000000000000004
>>> 1.2-1
0.19999999999999996
>>>

虽然误差很小,但是这只是普通的减法啊!!!
能不能解决啊?
根据目前的浮点运算的标准, 这样的计算结果是正确的.
但是, 在python或者其它通用编程语言(比如scheme, java中), 是不可以直接这样的:
0.8 - 0.6 == 0.2
这个判定条件会返回false (或者False). 但, 可以变通一下, 比如在python中, 需要这样来判定两个浮点数是否相等:

代码: 全选

if (0.8 - 0.6) - 0.2 <= sys.float_info.epsilon:
    print('0.8 - 0.6 == 0.2')
else:
    print('Not equal')
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: python 有关小数减法精度的问题

#4

帖子 月下叹逍遥 » 2014-05-16 22:29

代码: 全选

c=1.0
d=2.1
(d-c)==1.1
返回True :em01
浮生七十今三十,从此凄惶未可知
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: python 有关小数减法精度的问题

#5

帖子 月下叹逍遥 » 2014-05-16 22:32

:em20 好吧,不完全适用。。。还是用极小量做判据吧
浮生七十今三十,从此凄惶未可知
头像
yq-ysy
论坛版主
帖子: 4650
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)

Re: python 有关小数减法精度的问题

#6

帖子 yq-ysy » 2014-05-18 8:29

Python 3 文档(简体中文) 3.2.2 documentation
14. 浮点算术: 问题和限制
http://docspy3zh.readthedocs.org/en/lat ... point.html

……摘录……原文有例子……
不幸的是, 大多数的十进制小数都无法严格的以二进制来表示.
一个结果就是, 普遍来说, 你输入的十进制的小数, 通常只是以接近的二进制数表示.

……摘录……原文有例子……
在需要严格的数值表示时, 试试使用 decimal 模块,
这个模块实现了用于账目运算或更高精度时用到的数值算法.
另一种就是 fractions 模块, 它实现了基于有理数的算法 ( 所以 1/3 就可以准确的表述 ).
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
联系:

Re: python 有关小数减法精度的问题

#7

帖子 cuihao » 2014-05-18 15:00

用 decimal 模块。

代码: 全选

Python 3.4.0 (default, Apr 27 2014, 23:33:09) 
[GCC 4.8.2 20140206 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print(1.3-1)
0.30000000000000004
>>> 1.3-1 == 0.3
False
>>> from decimal import Decimal
>>> print(Decimal('1.3')-Decimal('1'))
0.3
>>> Decimal('1.3')-Decimal('1') == Decimal('0.3')
True
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
回复