2013-10-25 34 views
0

我必须创建一个Python类,它将数字量更改为法语文本。 我发现了一类做这项工作,但是当所述浮子是50.4例子,它返回“Cinquante units et 399使用浮点数时Python函数的意外结果

功能toText需要3个参数:所述浮子来转换,所述单元,所述decim

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") 
+0

作用的结果是正确的。你能否把标题改为“意外的结果...当使用浮动” –

回答

2

而不是z=int(y)尝试使用z=int(round(y,0))。这应该与float正好圆你... 399.99至400。

>>> int(round((50.4-50.)*1000, 0)) 
400 
1

的问题是,50.4不能被精确表示:

>>> print('{:.47f}'.format(50.4)) 
50.39999999999999857891452847979962825775146484375 

该故障是在toText函数的定义的行:

x=int(nb) 
y=(nb-x)*1000 
z=int(y) 

将导致z399,而不是400

如果您想要提供更多“用户友好”输出,您必须手动检查小数部分是否“奇怪”并相应舍入。

2

这只是大家最喜欢的老朋友,浮点错误。

线条:

x=int(nb) 
y=int((nb-x)*1000) 

最终做:

(50.4-50)*1000 
# try this in your interpreter: 399.9999999999986 

50.4不能精确地与一个(53位)表示的浮点数。您将需要通过字符串格式或舍入来相应地进行调整。

2

至于其他的答案已经说了,你不能代表准确浮点,因此50.4是当你看到打印。

你可以尝试使用包decimal:它是能够代表浮点准确,你也许能得到预期的结果

1

你可以使用round

def toText(nb, unite="Dinar", decim="millime"): 
    x=int(nb) 
    y=(nb-x)*1000 
    z=int(round(y))