使用浮点时Python函数产生意外结果
我必须创建一个Python类,该类将数字量更改为法语文本。 我发现一个类可以完成这项工作,但当每个示例的浮点值为50.4时,它返回Cinquante units et 399 函数toText接受3个参数:要转换的浮点、单位和分贝使用浮点时Python函数产生意外结果,python,python-2.7,Python,Python 2.7,我必须创建一个Python类,该类将数字量更改为法语文本。 我发现一个类可以完成这项工作,但当每个示例的浮点值为50.4时,它返回Cinquante units et 399 函数toText接受3个参数:要转换的浮点、单位和分贝 def tradd(num): global t1,t2 ch='' if num==0 : ch='' elif num<20: ch=t1[num] elif num>=20:
def tradd(num):
global t1,t2
ch=''
if num==0 :
ch=''
elif num<20:
ch=t1[num]
elif num>=20:
if (num>=70 and num<=79)or(num>=90):
z=int(num/10)-1
else:
z=int(num/10)
ch=t2[z]
num=num-z*10
if (num==1 or num==11) and z<8:
ch=ch+' et'
if num>0:
ch=ch+' '+tradd(num)
else:
ch=ch+tradd(num)
return ch
def tradn(num):
global t1,t2
ch=''
flagcent=False
if num>=1000000000:
z=int(num/1000000000)
ch=ch+tradn(z)+' milliard'
if z>1:
ch=ch+'s'
num=num-z*1000000000
if num>=1000000:
z=int(num/1000000)
ch=ch+tradn(z)+' million'
if z>1:
ch=ch+'s'
num=num-z*1000000
if num>=1000:
if num>=100000:
z=int(num/100000)
if z>1:
ch=ch+' '+tradd(z)
ch=ch+' cent'
flagcent=True
num=num-z*100000
if int(num/1000)==0 and z>1:
ch=ch+'s'
if num>=1000:
z=int(num/1000)
if (z==1 and flagcent) or z>1:
ch=ch+' '+tradd(z)
num=num-z*1000
ch=ch+' mille'
if num>=100:
z=int(num/100)
if z>1:
ch=ch+' '+tradd(z)
ch=ch+" cent"
num=num-z*100
if num==0 and z>1:
ch=ch+'s'
if num>0:
ch=ch+" "+tradd(num)
return ch
def trad(nb, unite):
global t1,t2
x=int(nb)
y=int((nb-x)*1000)
t1=["","un","deux","trois","quatre","cinq","six","sept","huit","neuf","dix","onze","douze","treize","quatorze","quinze","seize","dix-sept","dix-huit","dix-neuf"]
t2=["","dix","vingt","trente","quarante","cinquante","soixante","soixante-dix","quatre-vingt","quatre-vingt dix"]
if x==0:
ch="zéro"
else:
ch=tradn(abs(x))
if x>1 or x<-1:
if unite!='':
ch=ch+" "+unite+'s'
else:
ch=ch+" "+unite
if x<0:
ch="moins "+ch
return ch
def toText(nb, unite="Dinar", decim="millime"):
x=int(nb)
y=(nb-x)*1000
z=int(y)
if y > 1:
text_amount=trad(x,unite)+" et "+str(z)+" "+decim+"s"
elif y==1:
text_amount=trad(x,unite)+" et "+str(z)+" "+decim
elif y==0:
text_amount=trad(x,unite)+" et zéro "+decim
return text_amount
if __name__=='__main__':
print toText(45.4,"dinar")
问题是50.4不能准确表示:
>>> print('{:.47f}'.format(50.4))
50.39999999999999857891452847979962825775146484375
故障出现在toText函数的定义中。台词:
x=int(nb)
y=(nb-x)*1000
z=int(y)
x=int(nb)
y=int((nb-x)*1000)
将导致z为399而不是400
如果您想提供更方便用户的输出,您必须手动检查小数部分是否奇怪,并相应地舍入 这就是大家最喜欢的老朋友,浮点错误 台词:
x=int(nb)
y=(nb-x)*1000
z=int(y)
x=int(nb)
y=int((nb-x)*1000)
最后做:
(50.4-50)*1000
# try this in your interpreter: 399.9999999999986
50.4不能用53位浮点数精确表示。您需要通过字符串格式或舍入进行相应调整。请尝试使用z=introundy,0代替z=inty。这应该是你399.99的四舍五入。。。到400
>>> int(round((50.4-50.)*1000, 0))
400
正如其他答案已经说过的,您不能用float精确地表示浮点,因此正如您所看到的,50.4是打印出来的 您可以尝试使用该软件包:它能够准确地表示浮点,并且您可能能够获得预期的结果,您可以使用round
功能的结果是正确的。请您将标题更改为意外结果。。。使用浮动时