什么鬼啊(
众所周知,decimal模块可以让计算更准确我编写了一些代码,这个代码中有一个模块,模块根据加法法则计算 a + b 的结果
不要问我为什么不直接用加号(ry
代码如下:
def plus(a,b):
if a > 0 and b > 0:
return a,'+',b,'=',abs(a)+abs(b)
if a < 0 and b < 0:
return '(',a,') + (',b,')=',-(abs(a)+abs(b))
if a > 0 and b < 0:
if abs(a) > abs(b):
return a,'+ (',b,') =',a - abs(b)
else:
return a,'+ (',b,')=',-(abs(b) - a)
if a < 0 and b > 0:
if abs(a) > abs(b):
return '(',a,') +',b,'=',-(abs(a) - b)
else:
return '(',a,') +',b,'=',b - abs(a)
if a == 0:
return a,'+',b,'=',b
if b == 0:
return a,'+',b,'=',a
print(*plus(1,1))#一和一相加,应得二
计算0.1 + 0.2的返回值是:
0.1 + 0.2 = 0.30000000000000004
为了让计算更准确,我使用了decimal模块:
from decimal import Decimal
def plus(a,b):
a = Decimal(a)
b = Decimal(b)
if a > 0 and b > 0:
return a,'+',b,'=',abs(a)+abs(b)
if a < 0 and b < 0:
return '(',a,') + (',b,')=',-(abs(a)+abs(b))
if a > 0 and b < 0:
if abs(a) > abs(b):
return a,'+ (',b,') =',a - abs(b)
else:
return a,'+ (',b,')=',-(abs(b) - a)
if a < 0 and b > 0:
if abs(a) > abs(b):
return '(',a,') +',b,'=',-(abs(a) - b)
else:
return '(',a,') +',b,'=',b - abs(a)
if a == 0:
return a,'+',b,'=',b
if b == 0:
return a,'+',b,'=',a
print(*plus(0.1,0.2))#0.1和0.2相加,应得0.3
结果返回的值是:
0.1000000000000000055511151231257827021181583404541015625 + 0.200000000000000011102230246251565404236316680908203125 = 0.3000000000000000166533453694
怎么越来越不准了( 这是因为在使用Decimal模块时,需要使用字符串或整数来初始化Decimal对象,而不是浮点数。因为浮点数在计算机内部是以二进制表示的,而二进制小数并不能精确地表示十进制小数。因此,当你传递浮点数给Decimal时,它实际上是在对一个近似值进行运算,而不是精确值。因此,当你把0.1和0.2传递给plus函数时,它们实际上被转换为了近似值,而不是精确的0.1和0.2。因此,最终结果也是近似值,而不是精确的0.3。要解决这个问题,你可以将0.1和0.2转换为字符串,然后将它们传递给Decimal。例如:Decimal('0.1')和Decimal('0.2')。这样,你将得到精确的结果。 我注意到你在使用decimal模块时遇到了准确性问题。实际上,浮点数计算的精度受到二进制浮点表示法的限制。即使使用decimal模块,也无法完全解决这个问题。
为了尽量提高准确性,你可以在初始化Decimal对象时指定精度。例如,可以使用"Decimal('0.1')"和"Decimal('0.2')"来初始化a和b,而不是直接传递0.1和0.2作为参数。
下面是修正后的代码示例:
from decimal import Decimal
def plus(a, b):
a = Decimal(str(a))
b = Decimal(str(b))
if a > 0 and b > 0:
return f"{a} + {b} = {a + b}"
if a < 0 and b < 0:
return f"({a}) + ({b}) = {a + b}"
if a > 0 and b < 0:
if abs(a) > abs(b):
return f"{a} + ({b}) = {a - abs(b)}"
else:
return f"{a} + ({b}) = {-(abs(b) - a)}"
if a < 0 and b > 0:
if abs(a) > abs(b):
return f"({a}) + {b} = {-(abs(a) - b)}"
else:
return f"({a}) + {b} = {b - abs(a)}"
if a == 0:
return f"{a} + {b} = {b}"
if b == 0:
return f"{a} + {b} = {a}"
print(plus(0.1, 0.2))
这样使用Decimal对象来进行计算,可以提高浮点数计算的准确性。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} isdkz 发表于 2023-10-11 21:38
这是因为在使用Decimal模块时,需要使用字符串或整数来初始化Decimal对象,而不是浮点数。因为浮点数在计算 ...
我照你说的给a和b变成了字符串,为什么出现了decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
a = Decimal('a')
b = Decimal('b') 半灵桑 发表于 2023-10-11 21:40
我照你说的给a和b变成了字符串,为什么出现了decimal.InvalidOperation: []
它们是GPT,不会回复你的{:10_256:} 这都啥啊这是,救命啊来个活人吧{:10_250:}
琅琊王朝 发表于 2023-10-11 21:44
它们是GPT,不会回复你的
救命啊来个活人吧{:10_250:} 半机械生命满意不?{:10_256:}
c.binjie.fun说:
在使用 decimal 模块时,需要注意使用正确的精度和舍入方式来确保计算的准确性。默认情况下,decimal 模块使用较高的精度进行计算,但是在输出结果时会根据上下文环境进行舍入。
在你的代码中,你使用了 Decimal 类将浮点数转换为 Decimal 对象,在执行加法计算时仍然使用了普通的加法运算符。由于浮点数在内部存储时存在一定的精度误差,因此结果可能会有微小的偏差。
为了解决这个问题,可以使用 decimal 模块提供的加法函数 decimal.Decimal.add() 来执行精确的加法计算,并通过设置精度和舍入方式来获得期望的结果。
以下是修改后的代码示例:
from decimal import Decimal, ROUND_HALF_UP
def plus(a, b):
a = Decimal(a)
b = Decimal(b)
sum = a + b
return a, '+', b, '=', sum.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
print(*plus(0.1, 0.2))# 0.1和0.2相加,应得0.3
输出结果为:
0.10 + 0.20 = 0.30
通过使用 Decimal.quantize() 方法,我们设置了精度为两位小数,并使用四舍五入的舍入方式,从而得到了期望的结果。
请注意,decimal 模块是用于处理精确计算的,但在某些情况下也可能需要根据特定需求来进行进一步的调整。
yiyan.baidu.com说:
在Python中,使用decimal模块确实可以增加计算的精度,但是在处理像0.1 + 0.2这样的浮点数时,由于计算机内部表示浮点数的方式(通常使用二进制),即使使用decimal模块也可能会出现精度问题。这是由于一些小数不能被精确地表示为二进制小数。
在计算机中,所有的小数都是以二进制的形式存储的。但是有一些十进制小数,比如0.1或0.2,在二进制中只能被近似表示,而不能精确表示。因此,即使你使用了decimal模块,计算机在处理这些数值时仍可能产生一些小的误差。
所以,无论使用哪种方式进行浮点数计算,都可能会有精度问题。这是因为在计算机中,浮点数的精度是有限的。当你需要处理的数值非常接近时,这种误差可能会变得很明显。
如果你需要处理的数值非常大或者非常小,或者需要非常精确的计算结果,那么可能需要考虑使用其他的数据类型或者方法,比如整数运算,或者对数值进行适当的缩放以便进行更精确的浮点数运算。
对于这种问题,一般的解决方法是:在可接受的误差范围内,认为计算结果是正确的。例如,即使你的计算结果是0.3000000000000000166533453694,在大多数情况下,你可以认为它就是0.3。如果你需要更精确的结果,你可能需要更复杂的算法或者数据类型。
??????
为什么不用+?
你这样违背了python之禅! https://blog.csdn.net/weixin_39715834/article/details/110908334 半灵桑 发表于 2023-10-11 21:40
我照你说的给a和b变成了字符串,为什么出现了decimal.InvalidOperation: []
把变量变成字符串不是直接加上引号,而是用 str(a) 或者 f'{a}'
修改后的代码:
from decimal import Decimal
def plus(a,b):
a = Decimal(f'{a}')
b = Decimal(f'{b}')
if a > 0 and b > 0:
return a,'+',b,'=',abs(a)+abs(b)
if a < 0 and b < 0:
return '(',a,') + (',b,')=',-(abs(a)+abs(b))
if a > 0 and b < 0:
if abs(a) > abs(b):
return a,'+ (',b,') =',a - abs(b)
else:
return a,'+ (',b,')=',-(abs(b) - a)
if a < 0 and b > 0:
if abs(a) > abs(b):
return '(',a,') +',b,'=',-(abs(a) - b)
else:
return '(',a,') +',b,'=',b - abs(a)
if a == 0:
return a,'+',b,'=',b
if b == 0:
return a,'+',b,'=',a
print(*plus(0.1,0.2))#0.1和0.2相加,应得0.3
琅琊王朝 发表于 2023-10-11 21:44
它们是GPT,不会回复你的
很遗憾地告诉你,我来了 琅琊王朝 发表于 2023-10-11 21:51
半机械生命满意不?
c.binjie.fun说:
这个网站我也在用欸(
页:
[1]