李二蛋 发表于 2022-2-11 10:34:12

0.1+0.2不精确问题

请问为什么只有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)

python爱好者. 发表于 2022-2-11 10:44:06

这是小数计算精度的问题,要用到一个模块import decimal
a = decimal.Decimal("0.1")
b = decimal.Decimal("0.2")
print(a + b)
0.3:

python爱好者. 发表于 2022-2-11 10:45:54

小甲鱼的动动手第 0 题:
https://fishc.com.cn/forum.php?mod=viewthread&tid=146944&extra=page%3D1%26filter%3Dtypeid%26typeid%3D760

python爱好者. 发表于 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 ...

是动动手的答案部分

python爱好者. 发表于 2022-2-11 10:47:22

所有的小数计算都要用到 decimal 模块,
您的第二个问题也是同理!

Twilight6 发表于 2022-2-11 10:53:41


计算机存储浮点型数据时,进行进制转换时导致产生误差

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

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

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

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

python爱好者. 发表于 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?mod=viewthread&tid=148763&extra=page%3D1%26filter%3Dtypeid%26typeid%3D768

李二蛋 发表于 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相对精准。
您觉得我说的对么?如有问题希望得到您指正。{:5_92:}

李二蛋 发表于 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相对精准。
您觉得我说的对么?如有问题希望得到您指正。{:5_92:}

李二蛋 发表于 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 ...

谢谢您{:5_91:}

python爱好者. 发表于 2022-2-11 11:34:09

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


全对{:10_323:}

python爱好者. 发表于 2022-2-11 11:34:41

李二蛋 发表于 2022-2-11 11:33
谢谢您

给个最佳呗

李二蛋 发表于 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相对精准。
您觉得我说的对么?如有问题希望得到您指正。{:5_92:}

python爱好者. 发表于 2022-2-11 11:35:54

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


全对{:10_323:}

李二蛋 发表于 2022-2-11 11:36:47

python爱好者. 发表于 2022-2-11 11:34
全对

真的嘛,我不太确定{:5_96:}希望给出指正

python爱好者. 发表于 2022-2-11 11:38:37

李二蛋 发表于 2022-2-11 11:36
真的嘛,我不太确定希望给出指正

这第一题我不确定,其他的都能确定,因为我也没有去深入了解这个模块

Twilight6 发表于 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 ,因为误差部分被截取掉了,后续你解释的没毛病


页: [1]
查看完整版本: 0.1+0.2不精确问题