网站首页 > 技术文章 正文
1+2=3,这是我们小时候就学过的一位数加减法。这道题非常简单,难度仅次于1+1=2.
什么?你觉得2-1=1更简单?啊这。
显然,按照常理来讲,0.1+0.2当然等于0.3
对于刚上小学二年级的小王来说事情没有那么简单。计算机课上,他用python编写了一个计算器,计算0.1+0.2的时候,却得到了0.30000000000000004这个离谱的答案。
和小王一样,我们在小学二年级的高数课上就学过无穷小量的概念。这里0.3和0.30000000000000004只相差了一个很小的值,可以认为这是合理的误差。不过,如果遇到一些极端情况,这样的bug很有可能导致财务上的损失。举个例子,小王需要购买x只笔和y个本子送给二年级的同学们做高数题,他计算出需要支付的金额会超过实际需要的金额。若是他给全国乃至全世界的小学二年级的小朋友购买笔记本和笔,那么小王将额外产生一笔不必要的损失。
那么python中为什么0.1+0.2不会得到0.3,反而得到0.30000000000000004呢?这要从二进制讲起。
我们今天所用的计算机,即便是显示10101010这样的二进制数字,还是显示233的十进制数字,他们在内存里都用010101的二进制表示。比如,8这个数字就用1000表示。最高位的1表示1*2的3次幂,其他三位表示为0*2的2、1、0次幂。所有加起来,一共是8.
但这个世界上不是只有整数,无理数和小数也是宇宙的一部分。计算机又怎样表示小数呢?
这里以0.1为例。取小数部分0.1,乘2,若小于1则用0表示,否则1表示,同时去掉整数部分。
0.1到0.2,0.4,0.8三次变换得到的都是0,但下一次1.6,1.2,0.4得到110.类似的,这样得到了000110来表示0.1 。实际上,计算机中的位数远远超过我所举例部分。
同样,0.2也被表示为001100 … …
不同于整数,不是每一个小数的小数部分的处理都能完全精确。0.125这样的数字乘3次即可得到1,而0.124和0.126则相对于更容易丢失精度。因此,二进制表示的小数是不一定精确的,存在误差是很正常的。
幸运的是,python,C#等语言都有针对财务方面的精准的小数运算。使用python的decimal库,可以得到想要的精度。
也许有小学一年级的小朋友会问,为什么计算机不做成十进制,反而要做成二进制的呢?
您可以关注“Daniel谈技术”,我们后面会对计算机历史和芯片进行科普。
- 上一篇: Python基础学习笔记之运算符
- 下一篇: python类杂谈,self 到底是什么
猜你喜欢
- 2025-05-27 Python6大基础运算符,看完这篇之后会让你有一个彻底认识
- 2025-05-27 SymPy:如何用 Python 求解微积分
- 2025-05-27 Python编程术语词汇表(一)
- 2025-05-27 Python 中关于除法的三种运算符
- 2025-05-27 python类杂谈,self 到底是什么
- 2025-05-27 Python基础学习笔记之运算符
- 2025-05-27 「每日一练」巧用python找出1000以内的所有完数
- 2025-05-27 Python魔法方法:__eq__方法
- 2025-05-27 什么是函数(Python
- 2025-05-27 python编程学习系列:求平方根
- 268℃Python短文,Python中的嵌套条件语句(六)
- 267℃python笔记:for循环嵌套。end=""的作用,图形打印
- 265℃PythonNet:实现Python与.Net代码相互调用!
- 261℃Python实现字符串小写转大写并写入文件
- 259℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 120℃原来2025是完美的平方年,一起探索六种平方的算吧
- 100℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 94℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)