2013-10-25 32 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))