
回复内容:
这是因为小数以二进制形式表示时的有穷性导致的。(下面的说法,不完全准确,只是帮助理解)以下是之前我在另一个地方对一个类似问题的解答,因为内容差不多,就直接搬过来了(本人略懒,希望有所帮助):
#################################此处开始####################################
我们知道,将一个小数转化为二进制表示的方式是,不断的乘2,取其中的整数部分。例如:
+----------------------------------------------------------------------------------------------------------------------------------+
(1) 0.625*2 = 1.25, 整数部分为1,小数部分为0.25
(2) 0.25 * 2 = 0.5 , 整数部分为0,小数部分为0.5
(3) 0.5 * 2 = 1 , 整数部分为1,小数部分为0
+----------------------------------------------------------------------------------------------------------------------------------+
所以0.625的二进制表示就是0.101。
然而有些小数,例如0.4,并不能够精确的转化为二进制表示,用上面的这种方法计算:
+----------------------------------------------------------------------------------------------------------------------------------+
(1) 0.4*2=0.8 整数部分为0,小数部分为0.8
(2) 0.8*2=1.6 整数部分为1,小数部分为0.6
(3) 0.6*2=1.2 整数部分为1,小数部分为0.2
(4) 0.2*2=0.4 整数部分为0,小数部分为0.4
(5) 0.4*2=0.8 整数部分为0,小数部分为0.8
(6) 0.8*2=1.6 整数部分为1,小数部分为0.6
(7) 0.6*2=1.2 整数部分为1,小数部分为0.2
……
+----------------------------------------------------------------------------------------------------------------------------------+
所以0.4转化为二进制,应该是0.0110... 这样一个无限循环小数。
计算机的内存、cpu寄存器等等这些硬件单元都是有限的,只能表示有限位数的二进制位,因此存储的二进制小数就会和实际转换而成的二进制数有一定的误差。(你可以试着将0.3转化为二进制表示,也将出现一个循环小数。)
实际上,大多数情况下,小数在计算机中是以一种类似科学计数法的形式表示的,具体的可以参考一下其他的资料。但即便如此,仍然存在误差。
所以在python中不建议直接将两个浮点数进行大小比较,或者做精确的计算,往往会得到意想不到的结果。当然,如果非要用,可以参考decimal模块的相关内容。 请将十进制数字0.1转换成二进制浮点数。 这不是Python的问题,而是实数的无限精度跟计算机的有限内存之间的矛盾。
举个例子,假如说我只能使用整数(即只精确到个位,计算机内的浮点数也只有有限精度,以C语言中的双精度浮点数double为例,精度为52个二进制位),要表示任意实数(无限精度)的时候我就只能通过舍入(rounding)来近似表示。
比如1.2我会表示成1,2.4表示成2,3.6表示成4.
所以呢?
在算1.2 - 1.2的时候,由于计算机表示的问题,我算的实际上是1 - 1,结果是0,碰巧蒙对了;
在算1.2 + 1.2 - 2.4的时候,由于计算机表示的问题,我算的实际上是1 + 1 - 2,结果是0,再次蒙对了;
但是在算1.2 + 1.2 + 1.2 - 3.6的时候,由于计算机表示的问题,我算的实际上是1 + 1 + 1 - 4,结果是-1,运气没那么好啦!
这里的1.2, 2.4, 3.6就相当于你问题里的0.1, 0.2和0.3,1, 2, 4则是真正在计算机内部进行运算的数值,我说清楚了吗?
其他请看IEEE 754浮点数标准,比如CSAPP第二章啥的(虽然估计你没兴趣看)。
另:不仅仅是浮点数的在计算机内部的表示有误差,运算本身也可能会有误差。比如整数2可以在计算机内准确表示,但是要算根号2就有误差了;再比如两个浮点数相除,本来两个数都是精确表示的,但除的结果精度却超出了计算机内实数的表示范围,然后就有误差了。 计算机智能处理可数集合的运算,但是全体实数是不可数的,所以计算机只能用一些奇怪的方法来拟合他,于是就产生了浮点数。 这个不是python 的问题,所有基于二进制的浮点数都会有这个问题,原因在于大部分浮点数转换为二进制后都是无限循环小数,而浮点数不可能用无限大的内存来储存,所以会有舍入的误差
详细可以看代码之谜(五) 来个 @vczh 答案的通俗版,比如用 10 个箱子装100个球,规定每个箱子只能装一个球,那显然是装不下所有球的。类似,double类型是 64bit 的,最多能表达 2^64 个数,实数有多少呢?无数个,所以 double 类型是装不下所有实数的,只能表达一个近似值。 9.4. decimal 计算机所有信息的存储使用二进制表示,像 @vczh 所说,有限的「位」,无法表示无数个数,那么,小数用二进制表示法,只能表示那些能被写成

0.1 的二进制表示为 0.000110011[0011]...,因为是无限循环的,无法用有限的位表示,所以计算机系统会进行舍入,以求用最接近的值来表示,这里涉及到不同的舍入方式,具体请见深入理解计算机系统,本答案也是参考该书。 大白话版的很多人都说了,就是计算机有限的数字表示不了数学中无穷的数。
楼主如果有一定计算机或者数学基础可以搜一下IEEE754,电脑是如何表示浮点数的一种协议。看懂了那个协议就知道为什么了~
如果看不懂IEEE754那就需要研究下数学中各种进制~主要是二进制、十进制和他们的关系。 自傲的人类!有本事你直接喂它2进制数,看看还有没有这种精度问题。

Tomergelistsinpython,YouCanusethe操作员,estextMethod,ListComprehension,Oritertools

在Python3中,可以通过多种方法连接两个列表:1)使用 运算符,适用于小列表,但对大列表效率低;2)使用extend方法,适用于大列表,内存效率高,但会修改原列表;3)使用*运算符,适用于合并多个列表,不修改原列表;4)使用itertools.chain,适用于大数据集,内存效率高。

使用join()方法是Python中从列表连接字符串最有效的方法。1)使用join()方法高效且易读。2)循环使用 运算符对大列表效率低。3)列表推导式与join()结合适用于需要转换的场景。4)reduce()方法适用于其他类型归约,但对字符串连接效率低。完整句子结束。

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python的关键特性包括:1.语法简洁易懂,适合初学者;2.动态类型系统,提高开发速度;3.丰富的标准库,支持多种任务;4.强大的社区和生态系统,提供广泛支持;5.解释性,适合脚本和快速原型开发;6.多范式支持,适用于各种编程风格。

Python是解释型语言,但也包含编译过程。1)Python代码先编译成字节码。2)字节码由Python虚拟机解释执行。3)这种混合机制使Python既灵活又高效,但执行速度不如完全编译型语言。

useeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.ForloopSareIdeAlforkNownsences,而WhileLeleLeleLeleLoopSituationSituationSituationsItuationSuationSituationswithUndEtermentersitations。

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐个偏置,零indexingissues,andnestedloopineflinefficiencies


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版
好用的JavaScript开发工具