为什么0.1有时能准确打印,有时却不能?

2023-12-15

I run:

print(0.1)
print(0.2)
print(0.3)
print(0.4)
print(0.5)
print(0.5-0.4)
print(0.4-0.3)
print(0.3-0.2)
print(0.2-0.1)

表明:

0.1
0.2
0.3
0.4
0.5
0.09999999999999998
0.10000000000000003
0.09999999999999998
0.1

为什么直接打印数字可以,但是使用运算符-会得到意想不到的价值吗?

我检查过:浮点数学有问题吗?

If 0.5-0.4无法精确保存在硬件中,为什么打印(0.1)会显示0.1而不是0.10000000000xxx?

也许更明确的说法是:

根据我的理解,python 应该 print(0.1) 为 0.10000000000xxx,而 0.5-0.4 应该等于 0.4-0.3 并等于 0.3-0.2,对吧?

为什么Python可以“Python通过显示舍入值来保持位数的可管理性”?如果python想要print(0.1)为0.1,那么它应该将0.4-0.3视为0.1,对吗?为什么Python希望我们在这类话题上感到困惑?

为了更精确地说明这个问题“不是”,真正认为 0.5-0.4 != 0.4-0.3。我的主要问题是 print(0.1)= 0.1 而不是 0.10000000000xxxx,为什么 python 可以执行这种操作?它会让我们对“浮点数学坏了吗?”感到非常困惑。


Because 数字不相等。当您通过float直接到Decimal为了更好地表示正在发生的事情:

>>> from decimal import Decimal
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal(0.5 - 0.4)
Decimal('0.09999999999999997779553950749686919152736663818359375')

请注意,您从文字中获得的实际浮点值0.1与从文字中创建的浮点数相减的结果不同0.5 and 0.4。这是因为这两个字面量也会有错误 (note, 0.5可以精确地表示,因为它可以表示为 2 的幂)。

>>> Decimal(0.5)
Decimal('0.5')
>>> Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')

注意,string当你打印一个数字时,python打印的是甚至更多的是近似值,尽管 Python 使用的算法应该生成最短的表示形式,可以可靠地从文字中重现实际的浮点值:

>>> 0.5 - 0.4
0.09999999999999998
>>> Decimal(0.09999999999999998)
Decimal('0.09999999999999997779553950749686919152736663818359375')
>>> Decimal(0.5 - 0.4)
Decimal('0.09999999999999997779553950749686919152736663818359375')

请注意,我能想到的几乎所有语言都使用实际在硬件中表示的浮点数的截断形式。如果你想看到更多,通常必须使用字符串格式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么0.1有时能准确打印,有时却不能? 的相关文章

随机推荐

  • php:加载 oracle 驱动程序出现错误“无法加载动态库 - 找不到指定的过程。”

    我似乎在使用 PHP 时遇到了一个奇怪的问题 我已将一堆软件从一台服务器迁移到另一台服务器 在服务器上 一些脚本会与 Oracle 建立连接 因此为了能够建立连接 需要安装 Oracle 客户端并放置一个 tnsnames 文件 来自 sq
  • 如何在 jquery ui 自动完成中使用 json 传递隐藏 id?

    也许它是重复的 但我找不到解决方案 所以我发布了这个问题 我使用 jquery ui 来自动完成搜索框 它工作正常 但问题是我想使用 id example 进行搜索 当用户输入 paris 时 我尝试在 mysql 中发送 city id
  • 如何获取 Android 设备中的处理器速度和 RAM

    谁能帮助我如何通过代码获取 Android 设备的处理器名称 速度和 RAM 您可以像我们通常在 Linux 中获取的那样获取处理器 RAM 和其他硬件相关信息 我们可以在普通的 Linux 系统中从终端发出这些命令 你don t需要有一个
  • 如何将自定义长注释 geom_text 放入甜甜圈图的绘图区域内?

    我有以下真实用例的精简版本 其中我创建了一个甜甜圈图 并希望这些长标签适合整个图内部但甜甜圈外部 library ggplot2 df lt data frame group c Cars Trucks Motorbikes n c 25
  • 在并发创建线程之前读取修改的变量是否安全?

    pseudocode for illustration int g 0 void fn if g 1 std cout lt lt hello lt lt std endl else std cout lt lt world lt lt s
  • 在 python 中打开并显示适合图像

    import matplotlib pyplot as plt from astropy io import fits def openfit b hdu list fits open b hdu list info image data
  • 使用 jQuery 获取点击颜色的十六进制值

    我想知道如何使用 jQuery 制作一个颜色选择器 它允许您单击页面上的某个位置并返回您单击的颜色的十六进制颜色值 我知道使用 javascript 或 jquery 都是可能的 因为它们不仅有很多颜色选择器插件 而且我有一个具有相同功能的
  • 如何在“ExecuteGroovyScript”处理器中使用“DBCPConnectionPoolLookup”?

    我想在 ExecuteGroovyScript 处理器中使用 DBCPConnectionPoolLookup 控制器服务 我设置 数据库名称 但我收到这个错误 这是 ExecuteGroovyScript 配置 I found someo
  • 将数组(元素组合)划分为自定义分区的所有方法

    我想将 n 个元素的数组划分为给定大小的子数组 并包含所有可能的元素组合 例如 Array 1 2 3 4 可以是 n 个元素 1 给定尺寸模式 仅作为示例 可能会有所不同 2 subarrays 2 elements 预期结果 1 2 3
  • 增加图像中文本行之间的间距

    我有一个单行距文本段落的输入图像 我正在尝试实现类似行间距选项的功能 以增加 减少 Microsoft Word 中文本行之间的间距 当前图像是单倍行距 如何将文本转换为双倍行距 或者说 5空间 本质上 我试图动态地重组文本行之间的间距 最
  • 控制台鼠标输入不起作用

    我正在使用 Visual Studio 开发一个 C 控制台项目 其中鼠标负责执行所有输入操作 它在 Windows 7 上运行良好 但在 Windows 10 上则不行 我将向您展示一些代码 这是我的实际代码的非常简化的版本 但这里是一样
  • Symfony2 - FOSUserBundle - 多个登录位置

    我正在使用 FOSUserBundle 并且我需要能够从 2 个不同的路由 或更多 登录 这些路线将有不同的模板 并且登录到不同的区域 登录之间唯一的区别是所需的权限 路线将类似于 site com 登录 site com admin lo
  • ApiController的自动测试

    我有一个ApiController并想通过包括路由在内的单元测试来测试它 一个例子 RoutePrefix prefix public class Controller ApiController HttpGet Route id1 pub
  • 在 C# 中手动取消固定 byte[]?

    在下面的代码中 client Connect Receive 似乎永久固定 byte 结果 导致内存永远不会被释放 因为它始终被固定 我正在寻找一种方法来告诉 C 结果在 this OnReceive 中使用后不再需要固定 但我找不到执行此
  • .NET 中不同线程之间共享的列表

    我在一个类中有一个静态列表 它将由不同的线程访问 每个线程从列表中添加 读取和删除自己的唯一项目 我想知道我是否必须担心使这个变量线程安全 因为即使同一个 List 对象在线程之间共享 它们也只会修改自己的唯一项目 你肯定必须通过以下方式实
  • 雷达动画安卓

    所以事情就是这样 我正在监视某些距离 并且我想将它们显示在雷达动画中 基础雷达图像是这样的像这样 不完全是 其中每个圆圈表示一个距离范围 这个想法是随着距离的变化 点向圆圈移动 我最初的方法是对同一雷达制作不同的图像 每个圆圈上都有一个点
  • 如何部署混合 C++/Java (JNI) 应用程序?

    tl dr C 插件需要调用 Java jar 库 如何将其部署给用户而不让用户太头疼 我正在为 Qt 应用程序编写 Qt 插件 该插件需要调用现有的 Java 库 这需要跨平台 Win Mac Linux 和架构 32 位和 64 位 I
  • MongoDB 修复命令失败

    以前我的磁盘空间不足 mongodb 停止工作 然后我增加了磁盘大小 但 mongodb 没有开始工作 虽然我启用了日记功能 但我执行了以下命令sudo u mongodb mongod dbpath var lib mongodb rep
  • 使用正则表达式在 bash 中搜索和替换

    我看过这个例子 hello ho02123ware38384you443d34o3434ingtod38384day echo hello 0 9 其语法如下 variable pattern replacement 不幸的是pattern
  • 为什么0.1有时能准确打印,有时却不能?

    I run print 0 1 print 0 2 print 0 3 print 0 4 print 0 5 print 0 5 0 4 print 0 4 0 3 print 0 3 0 2 print 0 2 0 1 表明 0 1 0