鱼C论坛

 找回密码
 立即注册
查看: 1113|回复: 16

[已解决]0.1+0.2不精确问题

[复制链接]
发表于 2022-2-11 10:34:12 | 显示全部楼层 |阅读模式

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

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

x
请问为什么只有0.1+0.2有问题,0.1+0.3,0.2+0.3却没问题,到底是0.1有问题还是0.2有问题
同理1.1+0.1有问题,但1.1+0.2却没问题
Fraction(1.1)=Fraction(11/10)为什么不等于Fraction(11,10)
最佳答案
2022-2-11 10:53:41
[b]
计算机存储浮点型数据时,进行进制转换时导致产生误差

小数转换过程中会有无限尾数的情况,此时计算机会自动进行截取,导致浮点型必然会出现误差

所以 1.1 + 0.1 ,但 1.1 + 0.2 却没问题是因为计算机在截取 1.1 + 0.1 时 恰好截取后前面的都为 0 了

而 1.1 + 0.2 截取后却有一个小误差值被同时截取了,所以导致输出的结果差异

用 decimal 模块可以更加精确的进行浮点型运算,但是误差是不可避免的,只是 decimal 精度比 float 精度高

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

使用道具 举报

发表于 2022-2-11 10:44:06 | 显示全部楼层
这是小数计算精度的问题,要用到一个模块
import decimal
a = decimal.Decimal("0.1")
b = decimal.Decimal("0.2")
print(a + b)
0.3

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

使用道具 举报

发表于 2022-2-11 10:45:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-11 10:46:24 | 显示全部楼层
python爱好者. 发表于 2022-2-11 10:45
小甲鱼的动动手第 0 题:
https://fishc.com.cn/forum.php?mod=viewthread&tid=146944&extra=page%3D1%26f ...

是动动手的答案部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-11 10:47:22 | 显示全部楼层
所有的小数计算都要用到 decimal 模块,
您的第二个问题也是同理!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-11 10:53:41 | 显示全部楼层    本楼为最佳答案   
[b]
计算机存储浮点型数据时,进行进制转换时导致产生误差

小数转换过程中会有无限尾数的情况,此时计算机会自动进行截取,导致浮点型必然会出现误差

所以 1.1 + 0.1 ,但 1.1 + 0.2 却没问题是因为计算机在截取 1.1 + 0.1 时 恰好截取后前面的都为 0 了

而 1.1 + 0.2 截取后却有一个小误差值被同时截取了,所以导致输出的结果差异

用 decimal 模块可以更加精确的进行浮点型运算,但是误差是不可避免的,只是 decimal 精度比 float 精度高

[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-11 10:53:52 | 显示全部楼层
python爱好者. 发表于 2022-2-11 10:47
所有的小数计算都要用到 decimal 模块,
您的第二个问题也是同理!

class fractions.Fraction(decimal)

解析:返回一个与 decimal.Decimal 参数具有相同值的 Fraction 实例。

注意:由于众所周知的浮点数问题,导致 Fraction(1.1) 并不完全等于 11 / 10,所以 Fraction(Decimal(1.1)) 也不会返回 Fraction(11, 10)。

出处:https://fishc.com.cn/forum.php?m ... peid%26typeid%3D768
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-2-11 11:31:53 | 显示全部楼层
python爱好者. 发表于 2022-2-11 10:44
这是小数计算精度的问题,要用到一个模块:

感谢您的回复,我受益良多。请问您:
1.Decimal("1.1")和Decimal(1.1)为什么不同?
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Decimal('1.1')
Decimal('1.1')
所以Decimal(1.1)是得出的是实际上有误差的情况,而Decimal('1.1')是去除误差的情况么?
2.
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> 2476979795053773/2251799813685248
1.1
>>> 11/10
1.1
这两个1.1是精确的么,有什么区别?
我认为,这两个1.1都不是精确的,这两个1.1结果都等于=
print(Decimal('1.100000000000000088817841970012523233890533447265625'))
只是截取的这个数前面的1.1留下来了。
1.1最精确的解是Fraction(11,10)=Fraction(Decimal('1.1')),但是还是存在一定误差,误差是不可避免的
因此1.1是无法被完全精确解出来的。若想进行浮点数运算必用到Decimal才可以,Decimal相对精准。
您觉得我说的对么?如有问题希望得到您指正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-11 11:32:54 | 显示全部楼层
Twilight6 发表于 2022-2-11 10:53
计算机存储浮点型数据时,进行进制转换时导致产生误差

小数转换过程中会有无限尾数的情况,此时计算机 ...

感谢您的回复,我受益良多。请问您:
1.Decimal("1.1")和Decimal(1.1)为什么不同?
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Decimal('1.1')
Decimal('1.1')
所以Decimal(1.1)是得出的是实际上有误差的情况,而Decimal('1.1')是去除误差的情况么?
2.
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> 2476979795053773/2251799813685248
1.1
>>> 11/10
1.1
这两个1.1是精确的么,有什么区别?
我认为,这两个1.1都不是精确的,这两个1.1结果都等于=
print(Decimal('1.100000000000000088817841970012523233890533447265625'))
只是截取的这个数前面的1.1留下来了。
1.1最精确的解是Fraction(11,10)=Fraction(Decimal('1.1')),但是还是存在一定误差,误差是不可避免的
因此1.1是无法被完全精确解出来的。若想进行浮点数运算必用到Decimal才可以,Decimal相对精准。
您觉得我说的对么?如有问题希望得到您指正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-11 11:33:45 | 显示全部楼层
python爱好者. 发表于 2022-2-11 10:45
小甲鱼的动动手第 0 题:
https://fishc.com.cn/forum.php?mod=viewthread&tid=146944&extra=page%3D1%26f ...

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

使用道具 举报

发表于 2022-2-11 11:34:09 | 显示全部楼层
李二蛋 发表于 2022-2-11 11:31
感谢您的回复,我受益良多。请问您:
1.Decimal("1.1")和Decimal(1.1)为什么不同?
>>> Decimal(1.1)

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

使用道具 举报

发表于 2022-2-11 11:34:41 | 显示全部楼层

给个最佳呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-11 11:34:59 | 显示全部楼层
python爱好者. 发表于 2022-2-11 10:53
class fractions.Fraction(decimal)

解析:返回一个与 decimal.Decimal 参数具有相同值的 Fraction 实 ...

感谢您的回复,我受益良多。请问您:
1.Decimal("1.1")和Decimal(1.1)为什么不同?
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Decimal('1.1')
Decimal('1.1')
所以Decimal(1.1)是得出的是实际上有误差的情况,而Decimal('1.1')是去除误差的情况么?
2.
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> 2476979795053773/2251799813685248
1.1
>>> 11/10
1.1
这两个1.1是精确的么,有什么区别?
我认为,这两个1.1都不是精确的,这两个1.1结果都等于=
print(Decimal('1.100000000000000088817841970012523233890533447265625'))
只是截取的这个数前面的1.1留下来了。
1.1最精确的解是Fraction(11,10)=Fraction(Decimal('1.1')),但是还是存在一定误差,误差是不可避免的
因此1.1是无法被完全精确解出来的。若想进行浮点数运算必用到Decimal才可以,Decimal相对精准。
您觉得我说的对么?如有问题希望得到您指正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-11 11:35:54 | 显示全部楼层
李二蛋 发表于 2022-2-11 11:34
感谢您的回复,我受益良多。请问您:
1.Decimal("1.1")和Decimal(1.1)为什么不同?
>>> Decimal(1.1)

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

使用道具 举报

 楼主| 发表于 2022-2-11 11:36:47 | 显示全部楼层

真的嘛,我不太确定希望给出指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-11 11:38:37 | 显示全部楼层
李二蛋 发表于 2022-2-11 11:36
真的嘛,我不太确定希望给出指正

这第一题我不确定,其他的都能确定,因为我也没有去深入了解这个模块
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-11 11:44:49 | 显示全部楼层
李二蛋 发表于 2022-2-11 11:32
感谢您的回复,我受益良多。请问您:
1.Decimal("1.1")和Decimal(1.1)为什么不同?
>>> Decimal(1.1)


所以Decimal(1.1)是得出的是实际上有误差的情况,而Decimal('1.1')是去除误差的情况么?


说啦 误差不能去除,只是 Decimal 精度高,可以适当减小一些误差

这两个1.1是精确的么,有什么区别?


结果中的 1.1 ,因为误差部分被截取掉了,后续你解释的没毛病


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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