浮点算术:争议和限制

浮点数在计算机硬件中表示为以 2 为基数(二进制)的小数。

举例而言,十进制的小数

0.125=1/10 + 2/100 + 5/1000

同理二进制小数

0.001

0*1/2+0*1/4+1*1/8得十进制的0.125(二进制的小数转换为十进制主要是乘以2的负次方)

这两个小数具有相同的值,唯一真正的区别是第一个是以 10 为基数的小数表示法,第二个则是 2 为基数。

大多数的十进制小数都不能精确地表示为二进制小数。这导致在大多数情况下,你输入的十进制浮点数都只能近似地以二进制浮点数形式储存在计算机中。

用十进制来理解这个问题显得更加容易一些。考虑分数 1/3 。

我们可以得到它在十进制下的一个近似值 0.3

或者,更近似的,:0.33

或者,更近似的,:0.333

以此类推。结果是无论你写下多少的数字,它都永远不会等于 1/3 ,只是更加更加地接近 1/3 。

同样的道理,无论你使用多少位以 2 为基数的数码,十进制的 0.1 都无法精确地表示为一个以 2 为基数的小数。 在以 2 为基数的情况下, 1/10 是一个无限循环小数

0.0001100110011001100110011001100110011001100110011...

计算机只认识二进制,十进制之间的运算,需要将十进制转换为二进制在进行二进制之间的运算。

因为 Python 只会打印计算机中存储的二进制值的十进制近似值

>>>print(0.1+0.1+0.1)
0.30000000000000004

虽然病态的情况确实存在,但对于大多数正常的浮点运算使用来说,你只需简单地将最终显示的结果舍入为你期望的十进制数值即可得到你期望的结果。 str() 通常已足够,对于更精度的控制可参看 格式字符串语法 中 str.format() 方法的格式描述符。

对于需要精确十进制表示的使用场景,请尝试使用 decimal 模块,该模块实现了适合会计应用和高精度应用的十进制运算(数学上的四舍五入)

#新Decimal的重要性仅由输入的位数决定。 上下文精度和舍入仅在算术运算期间发挥作用。>>>print(decimal.Decimal('0.01')+decimal.Decimal('0.01')+decimal.Decimal('0.01'))
0.03
总是输入 decimal.Decimal('0.01')过于笨拙。
可将构造器简写为一个字母:
>>>D = decimal.Decimal
>>>D('0.01') + D('0.01') + D('0.01')

如何正确进行四舍五入

来测试一下,0.125 ,0.375 分别保留两位小数是多少:
print(decimal.Decimal('0.125').quantize(Decimal('.01')))  0.12
print(decimal.Decimal('0.375').quantize(Decimal('.01')))  0.38
来并未达到预期效果,

我们可以通过指定quantize() 中 rounding参数来确定进位方式。如果没有指定 rounding参数,那么默认使用上下文提供的进位方式。rounding=ROUND_HALF_EVEN

ROUND_HALF_EVEN实际上就是 奇进偶舍!如果要指定真正的四舍五入,那么我们需要在 quantize中指定进位方式为 ROUND_HALF_UP

quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_UP)

Python的官方中文文档 decimal --- 十进制定点和浮点运算 — Python 3.10.2 文档

关于使用round函数

round(number[, ndigits])

返回 number 舍入到小数点后 ndigits 位精度的值。 如果 ndigits 被省略或为 None,则返回最接近输入值的整数。

对于支持 round() 方法的内置类型,结果值会舍入至最接近的 10 的负 ndigits 次幂的倍数;如果与两个倍数同样接近,则选用偶数。因此,round(0.5) 和 round(-0.5) 均得出 0 而 round(1.5) 则为 2ndigits 可为任意整数值(正数、零或负数)。如果省略了 ndigits 或为 None ,则返回值将为整数。否则返回值与 number 的类型相同。

round对小数的精确度采用了 四舍六入五成双的方式。( 奇进偶舍的处理方法)

其具体要求举例如下(以保留两位小数为例):一个小数 a.bcd

  1. 如果 d小于5,直接舍去,则舍去。例如:5.214保留两位小数为5.21。

  2. 如果 d大于5,直接进位。例如5.216保留两位小数为5.22。

  3. 如果 d等于5:而且d后面不再有数,要根据应看尾数“5”的前一位C决定是舍去还是进入: 如果是奇数进入,如果是偶数舍去。例如5.215保留两位小数为5.22; 5.225保留两位小数为5.22。

  4. 如果 d等于5:而且d后面仍有数。例如5.2254保留两位小数为5.23,也就是说如果5后面还有数据,则无论奇偶都要进入。

四舍五入(保留2位小数,只舍不入)

通过计算的途径,很难将最终结果截取2位,通过字符串,直接截取就可以了。

>>> a = 12.345>>> str(a).split('.')[0] + '.' + str(a).split('.')[1][:2]'12.34'
def get_float(f_str,n):a, b, c = f_str.partition('.')c = c[:n]return ".".join([a, c])
if __name__ == '__main__':print(get_float("12.345", 2))
#使用re模块
a = 12.345
re.findall(r"\d{1,}?\.\d{2}", str(a))

四舍五入(保留2位小数,只入不舍)

不根据小数位第三位进行四舍五入,只要后面有值就进行入

print(decimal.Decimal('0.370001').quantize(Decimal('.01'), rounding=decimal.ROUND_UP))
0.38

根据小数位第三位进行四舍五入

先截取成三位小数再进行 rounding=decimal.ROUND_UP

向上/下取整(ceil(a)函数与floor(a)函数)

import math# 向上取整 3
import math
print("math.ceil(2.3) => ", math.ceil(2.3))
print("math.ceil(2.6) => ", math.ceil(2.6))
# 向下取整 2
print("math.floor(2.3) => ", math.floor(2.3))
print("math.floor(2.6) => ", math.floor(2.6))

Python 浮点数计算 小数取舍指南相关推荐

  1. python 浮点数计算

    python 浮点数计算之 加减乘除 ------------------- 适用正负数整数浮点数 class float_subtraction():def __init__(self, _sbt, ...

  2. Python浮点数(小数)运算误差的原因和解决方法

    原因解释: 浮点数(小数)在计算机中实际是以二进制存储的,并不精确. 比如0.1是十进制,转换为二进制后就是一个无限循环的数: 0.0001100110011001100110011001100110 ...

  3. python浮点数计算出现无限小数

    浮点数精度问题不是与编程语言种类关系不大,与进制转换有关 for i in range(20):print(0.1,'*',i, '=',0.1*i) 0.1 * 0 = 0.0 0.1 * 1 = ...

  4. Python 浮点数计算出十几位小数的解决方法

    0.1+0.2 Out[2]: 0.30000000000000004 3.14*19 Out[4]: 59.660000000000004 0.1*0.2 Out[5]: 0.02000000000 ...

  5. Python 浮点数运算

    2019独角兽企业重金招聘Python工程师标准>>> 浮点数用来存储计算机中的小数,与现实世界中的十进制小数不同的是,浮点数通过二进制的形式来表示一个小数.在深入了解浮点数的实现之 ...

  6. python浮点数运算问题_python基础教程之. 浮点数运算:问题和局限

    14. 浮点数运算:问题和局限¶ 浮点数在计算机硬件中表示为以 2 为底(二进制)的小数.例如,十进制小数 0.125 是1/10 + 2/100 + 5/1000 的值,同样二进制小数 0.001 ...

  7. python 浮点数比较_Python中的浮点数

    浮点数在计算机中表达为二进制(binary)小数.例如:十进制小数: 0.125 是 1/10 + 2/100 + 5/1000 的值. 类似地,二进制小数: 0.001 是 0/2 + 0/4 + ...

  8. python浮点数怎么运算_Python 浮点数运算

    浮点数用来存储计算机中的小数,与现实世界中的十进制小数不同的是,浮点数通过二进制的形式来表示一个小数.在深入了解浮点数的实现之前,先来看几个 Python 浮点数计算有意思的例子: 0.1 == 0. ...

  9. python理解浮点数运算的误差_PyTips 0x1a - Python 浮点数运算

    版权声明:此文章转载自 Yushneng PyHub 如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com 本系列完整文档已托管在 Read the Docs: ...

最新文章

  1. Spring 4 使用Freemarker模板发送邮件添加附件
  2. ubuntu16.04忘了root密码
  3. BI推荐8款优秀的app
  4. C#InI文件读写剖析
  5. pat 乙级 1031 查验身份证(C++)
  6. python3支持中文_彻底颓了—— Vim Python 3 接口不支持中文 - Jacky Liu's Blog
  7. Mac Terminal终端光标的快捷键操作
  8. vlc-android编译流程
  9. python判断字符串回文_python实现--判断回文字符串、回文链表、回文数
  10. linux关闭的时候出现异常: java.net.ConnectException: 拒绝连接 (Connection refused)
  11. Centos 5.8 搭建ntp服务器
  12. 大学微积分考试能用计算机吗,AP微积分考试需要什么样的计算器?
  13. latex数学符号加粗_latex 数学符号加粗
  14. c语言笔试面试大全,C语言基础笔试题
  15. 比湿和相对湿度的转换、体感温度的计算
  16. 各种图片编码格式详解
  17. 数据分析大数据面试题大杂烩01
  18. UNI-APP,推广二维码页面实现
  19. Python 不用selenium 带你高效爬取京东商品评论
  20. vs2017+ivf+abaqus

热门文章

  1. 天干地支计算公式_如何快速的计算出每一天的天干地支
  2. python pass的含义
  3. 计算机桌面音量键在哪,win7系统控制音量的快捷方式有哪些
  4. 4399AT执行命令讲解
  5. 6、13iOS项目代码例子微博、地图、淘宝、豆瓣、指南针
  6. [渝粤教育] 中国矿业大学 中国传统手工艺与文化创意设计 参考 资料
  7. Manacher算法的基础应用:小A的回文串
  8. 英语听力挑战微信小程序
  9. nginx.conf配置文件说明
  10. .sh(shell)文件打印文件夹下所有文件的文件名