数字Python确定

2024-09-27 04:23:32 发布

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

我有一个函数,作为用户输入浮点参数。我需要确定这个参数在小数点右边的位数。我试过以下方法,但在函数中不起作用。有别的选择吗

def x(x,y,minp):
    delta = ( ( y - x)/ minp ) * 10
    return delta

本质上,我写了一个函数来计算2个值的增量,这个值有一个乘数。但是增量随着我在minp中指定的最小增量而变化

例如,如果x=100,y=90,minp=1,那么上面的值应该等于100,当y和x有小数点时,问题就出现了

有什么想法吗

编辑:

所以问题是如果说x = 99.10y=99.0,和minp=0.01,我得到99.99999999999432

我试过:

delta = ( ( 99.1 - 99.0 )/ 0.01 ) * 10
dec = decimal.Decimal( 0.01  )
rounding = dec.as_tuple().exponent
round(delta,rounding)

上面返回0.0


Tags: 方法函数用户参数returndef增量dec
1条回答
网友
1楼 · 发布于 2024-09-27 04:23:32

如果希望将数字精确舍入到小数位数(这通常是处理精度问题的错误方法),则需要将它们存储为Decimals:

from decimal import Decimal

def x(x, y, minp):
    delta = ( ( y - x)/ minp ) * 10
    return delta

result = x(Decimal("99.1"), Decimal("99.0"), Decimal("0.01"))

result
#>>> Decimal('-1.0E+2')

float(result)
#>>> -100.0

实际上,除了货币,这几乎是一种糟糕的做法。十进制数学只有这样一个特性:它能更精确地打印,而不是天生的更精确

相反,你通常希望

  • 正确解释精度误差,通常采用误差界和对浮点的良好理解

  • 完全没有错误:

    from fractions import Fraction
    
    def x(x, y, minp):
        delta = ( ( y - x)/ minp ) * 10
        return delta
    
    result = x(Fraction("99.1"), Fraction("99.0"), Fraction("0.01"))
    
    result
    #>>> Fraction(-100, 1)
    
    float(result)
    #>>> -100.0
    

    即使在函数中也很有用:

    from fractions import Fraction
    
    def x(x, y, minp):
        x = Fraction(x)
        y = Fraction(y)
        minp = Fraction(minp)
    
        delta = ( ( y - x)/ minp ) * 10
        return float(delta)
    
    result = x(99.1, 99.0, 0.01)
    
    result
    #>>> -99.99999999999432
    
    float(result)
    #>>> -99.99999999999432
    

    因为即使您有不精确的输入和输出,中介也是精确的。在这种情况下,它没有帮助,因为问题在于输入,而不是中介

第二种选择是缓慢的,所以实际上处理错误总是更好的。不管怎样,科学并不是给你无限精确的测量

相关问题 更多 >

    热门问题