使用float时Python函数产生意外结果

2024-06-13 13:10:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须创建一个Python类,将数字量更改为法语文本。 我发现一个类可以完成这项工作,但是当每个示例的float为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:
        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")

Tags: orandifdefchnumetint
3条回答

这简直就是大家最喜欢的老朋友,浮点错误。你知道吗

线路:

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

最后做:

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

50.4不能用(53位)浮点数精确表示。您需要通过字符串格式或舍入进行相应的调整。你知道吗

正如其他答案已经说过的,您不能用float精确地表示浮点,因此50.4会像您看到的那样打印出来。你知道吗

您可以尝试使用包decimal:它能够精确地表示浮点,并且您可能能够得到预期的结果

尝试使用z=int(round(y,0)),而不是z=int(y)。那应该是你399.99的四舍五入。。。到400。你知道吗

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

相关问题 更多 >