V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
nvksie
V2EX  ›  Python

请问,这是 Python 的 bug 吗?

  •  
  •   nvksie · 2019-04-10 15:52:49 +08:00 · 2832 次点击
    这是一个创建于 1814 天前的主题,其中的信息可能已经有所发展或是发生改变。
    >>> 4.8*12
    57.599999999999994
    >>>

    如果最后是个 9 都可以理解,为啥最后是个 4 ??
    17 条回复    2019-04-12 13:46:12 +08:00
    king1101
        1
    king1101  
       2019-04-10 16:01:01 +08:00
    这些错误是由底层 CPU 和 IEEE 754 标准通过自己的浮点单位去执行算术时的特征。由于 Python 的浮点数据类型使用底层表示存储数据,因此你没办法去避免这样的误差。如果想要精确一点的话,可以使用 decimal 模块。(摘自 Python Cookbook )
    xiaoheijw
        2
    xiaoheijw  
       2019-04-10 16:01:41 +08:00
    python 默认的是 17 位小数的精度,前 16 位是准确的,第 17 位开始不准确
    shuax
        3
    shuax  
       2019-04-10 16:04:28 +08:00
    基础不牢固啊
    shintendo
        4
    shintendo  
       2019-04-10 16:13:44 +08:00
    这不是 python 的 bug,而是几乎所有主流编程语言(使用 IEEE 754 格式存储浮点数)都有的问题
    其本质原因是,在十进制里能精确表示的小数,用二进制不一定能精确表示
    justou
        5
    justou  
       2019-04-10 16:19:49 +08:00
    每隔一段时间 python 都要出一个这种 bug
    这是好事, 说明玩蛇的队伍一直都在壮大
    wly19960911
        6
    wly19960911  
       2019-04-10 16:25:47 +08:00
    https://www.guokr.com/article/27173/ 看这篇就好了。主要是真实值展示和二进制存储存储的差异问题。
    hmzt
        7
    hmzt  
       2019-04-10 18:15:57 +08:00   ❤️ 1
    看来 c 语言作为入门语言还是很必要的,hh
    shawndev
        8
    shawndev  
       2019-04-10 18:17:14 +08:00
    这是浮点数的 bug,如果嫌计算不准确,听说可以试一试 fortran
    jhsea3do
        9
    jhsea3do  
       2019-04-10 18:29:10 +08:00
    nodejs 下有一款 big.js 很好用

    python 下用 numpy 可以

    import numpy as np
    np.multiply(4.8, 1.2)
    vcgo
        10
    vcgo  
       2019-04-10 18:29:44 +08:00
    浮点数运算丢失精度,不只是 Python,很多编程语言都是这样。
    jhsea3do
        11
    jhsea3do  
       2019-04-10 18:36:03 +08:00
    @jhsea3do numpy 的语法我搞错了,以前搞过的,有点忘记了
    whoami9894
        12
    whoami9894  
       2019-04-10 18:48:05 +08:00 via Android
    是的,这是解释器的 bug,楼主快去社区反馈
    mmdsun
        13
    mmdsun  
       2019-04-10 18:54:37 +08:00 via Android
    快去恶补基础。不止是 py 不少语言都丢精度。

    高精度运算比如价格:可以库里存分。用 long
    或者整数小数分开处理。
    java 可以用大数类运算。
    tcitry
        14
    tcitry  
       2019-04-10 20:03:37 +08:00
    看看小数点后的二进制表示法?
    nikolai
        15
    nikolai  
       2019-04-10 20:09:07 +08:00
    fan2006
        16
    fan2006  
       2019-04-11 06:43:36 +08:00
    from decimal import Decimal
    print(Decimal('4.8')*12)
    Qzier
        17
    Qzier  
       2019-04-12 13:46:12 +08:00 via iPhone
    与编程语言无关,与计算机浮点数的表示有关。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   959 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:40 · PVG 04:40 · LAX 13:40 · JFK 16:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.