转换为浮点或十进制时,值不正确。以下是一些例子:
"{0:.20f}".format(0.1) = '0.10000000000000000555'
"{0:.20f}".format(1/3) = '0.33333333333333331483'
Decimal(2.4) = Decimal('2.399999999999999911182158029987476766109466552734375')
在对数字进行四舍五入时,上述行为会导致问题。例如。我预计圆(6.345,2(等于6.35,但结果是6.34,可能是因为十进制(6.345(的计算值为6.3449999999975131004248396493494510650634765625,更接近6.34,而不是6.35。
为什么会发生这种情况?这方面的工作是什么?
我不知道这是否是你想要的,但你可以编写自己的round函数,按照你的意愿执行round过程。这里有一个例子,可能不是我最好的工作,当然还有更多的Python方法,但它至少是你可以建立的:
num = 6.345
def custom_round(number, spaces=0):
if isinstance(num, int):
return num
integer, decimal = str(number).split('.')
if spaces >= len(decimal):
return num
elif spaces == 0:
if int(decimal[:1]) >= 5:
return int(integer) + 1
else:
return int(integer)
elif int(decimal[spaces : spaces + 1]) >= 5:
return float(integer + "." + str(int(decimal[:spaces]) + 1))
else:
return float(integer + "." + str(int(decimal[:spaces])))
print(custom_round(num, 1))
# 6.3
print(custom_round(num, 2))
# 6.35
这可能是一种变通方法。
import math
from decimal import Decimal
print("{0:.20f}".format(0.1))
print("{0:.20f}".format(1/3))
def round_half_up(n, decimals=0):
multiplier = 10 ** decimals
return math.floor(n*multiplier + 0.5) / multiplier
num=6.345
print(round(Decimal(str(num)),2))
print(round_half_up(num,2))
输出:
0.10000000000000000555
0.33333333333333331483
6.34
6.35
参考:https://realpython.com/python-rounding/#rounding-半成品
如果这不能满足你的需求,那么我建议使用分数,比如你可以使用a=[6345100],而不是a=[6335,3](3表示1o^3(最后计算出答案的浮点值。但是,您将不得不为执行的所有算术运算手动生成函数。
以下是建议使用fractions.Fraction
的答案https://stackoverflow.com/a/53821658/11474769
我对它没有任何经验,但从文档来看,它在这种情况下似乎很有用。链接到fractions.Fraction
文档https://docs.python.org/3/library/fractions.html
请看一下。