鱼C论坛

 找回密码
 立即注册
查看: 238|回复: 8

浮点数的计算什么情况下才要用到decimal模块

[复制链接]
发表于 2024-3-10 23:48:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在IDLE中计算
0.1+0.2
0.30000000000000004
0.1*0.2
0.020000000000000004
20*0.2
4.0
20.0*0.2
4.0
0.9*0.2
0.18000000000000002
20.2*0.2
4.04
0.2*0.2
0.04000000000000001
为什么同样是浮点数,20.2*0.2和0.2*0,2的精度是不一样的

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-10 23:48:59 | 显示全部楼层
浮点数在计算机中以二进制形式存储,但是某些十进制小数无法精确表示为有限的二进制小数。因此,浮点数计算可能会导致舍入误差。

在上述示例中,当我们直接在IDLE中计算0.1 + 0.2时,结果并不是我们期望的精确的0.3。这是由于0.1和0.2无法精确表示为一个有限的二进制小数,因此相加时会产生一个舍入误差。

如果我们需要精确计算浮点数,特别是在金融或货币相关的应用中,可以使用Python的`decimal`模块。该模块提供了一个`Decimal`类,可以表示任意精度的十进制数。

下面是使用`decimal`模块进行浮点数计算的示例代码:

  1. from decimal import Decimal

  2. a = Decimal('0.1')
  3. b = Decimal('0.2')

  4. result = a + b
  5. print(result)  # 输出:0.3
复制代码


使用`Decimal`类可以避免舍入误差,得到我们期望的精确结果。请注意,`decimal`模块中的`Decimal`类的实例化需要传入一个字符串形式的数字,而不是直接传入浮点数。

所以,如果对于浮点数的精度要求比较高,可以考虑使用`decimal`模块进行计算。而对于一般情况下,Python内置的浮点数类型已经足够用了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-10 23:50:01 | 显示全部楼层
那20.3是浮点数吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-10 23:50:11 | 显示全部楼层


是的,20.3是一个浮点数。浮点数是一种用于表示带小数部分的数字的数据类型。在Python中,浮点数通常被表示为包含小数点的数字,例如20.3。请注意,即使一个数字看起来像整数,但如果它带有小数点,它仍然会被视为浮点数。浮点数可以进行各种数学运算,例如加法、减法、乘法和除法。然而,由于浮点数的内部表示方式存在舍入误差问题,所以在需要高精度计算的情况下,可能需要使用`decimal`模块。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-10 23:50:48 | 显示全部楼层
那为什么20.3*0.2不用decimal模块也能计算得到精确值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-10 23:51:14 | 显示全部楼层
captaindai 发表于 2024-03-10 23:50
那为什么20.3*0.2不用decimal模块也能计算得到精确值


当你计算20.3 * 0.2时,得到的结果是一个精确的值,并没有舍入误差。这是因为在这个特定的计算中,20.3和0.2可以被准确地表示为二进制小数。在计算机中,浮点数的表示方式是基于二进制的,有些十进制小数是无法精确表示为有限的二进制小数的,从而导致舍入误差的问题。但在这个特定的例子中,20.3和0.2的二进制表示是精确的,所以计算结果也是精确的。这种情况并不常见,大部分情况下浮点数计算可能会出现舍入误差,因此在需要高精度计算时,还是建议使用`decimal`模块来避免潜在的舍入误差。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-11 00:54:24 | 显示全部楼层
captaindai 发表于 2024-3-10 23:50
那为什么20.3*0.2不用decimal模块也能计算得到精确值

有些能有些不能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-11 01:09:22 | 显示全部楼层
本帖最后由 jackz007 于 2024-3-11 08:06 编辑

       电脑对浮点数的表达可以用一把带有刻度的尺子来形容,我们知道,浮点数的变化是无限的,而电脑中用于表达浮点数的数字个数却是有限的,就好比是尺子上的刻度,当我们在测量一个长度的时候,是通过读取尺子上有限的刻度来进行衡量的,显然,这个过程是含有误差的,电脑表达浮点数的道理也和尺子一样,也是通过有限个刻度点来进行表达的,对于一个浮点数,只是确定了一个最为接近的刻度点来进行代表,所以,电脑所表达的浮点数一定是存在有误差的,这是无法避免的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-11 07:33:28 From FishC Mobile | 显示全部楼层
在你需要精确值时全部使用这个模块就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表