分页: 1 / 1

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

发表于 : 2013-07-21 17:19
afox800
:em20 python
>>> 1.31-1.0
0.31000000000000005
>>> 1.5-1
0.5
>>> 1.3-1
0.30000000000000004
>>> 1.2-1
0.19999999999999996
>>>

虽然误差很小,但是这只是普通的减法啊!!!
能不能解决啊?

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

发表于 : 2014-05-16 16:20
mophisays
现在数字计算机的框架下,浮点数计算普遍存在精度问题,
即使强大如Mathematica,或者极致如Axiom,也未能免俗。

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

发表于 : 2014-05-16 22:21
nae6taiyie0T
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')

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

发表于 : 2014-05-16 22:29
月下叹逍遥

代码: 全选

c=1.0
d=2.1
(d-c)==1.1
返回True :em01

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

发表于 : 2014-05-16 22:32
月下叹逍遥
:em20 好吧,不完全适用。。。还是用极小量做判据吧

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

发表于 : 2014-05-18 8:29
yq-ysy
Python 3 文档(简体中文) 3.2.2 documentation
14. 浮点算术: 问题和限制
http://docspy3zh.readthedocs.org/en/lat ... point.html

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

……摘录……原文有例子……
在需要严格的数值表示时, 试试使用 decimal 模块,
这个模块实现了用于账目运算或更高精度时用到的数值算法.
另一种就是 fractions 模块, 它实现了基于有理数的算法 ( 所以 1/3 就可以准确的表述 ).

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

发表于 : 2014-05-18 15:00
cuihao
用 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