确定Python中特定数字的精度和小数位数

发布于 2021-01-29 17:37:16

我在Python中有一个包含浮点数的变量(例如num = 24654.123),我想确定数字的精度和小数位数(从Oracle的角度来看),因此123.45678应该给我(8,5),12.76应该给我(4,2)等

我最初是在考虑使用字符串表示形式(通过strrepr),但是这些操作对于大量失败了(尽管我现在理解的是浮点表示法的局限性才是问题所在):

>>> num = 1234567890.0987654321
>>> str(num) = 1234567890.1
>>> repr(num) = 1234567890.0987654

编辑:

好点在下面。我应该澄清。该数字已经是浮点数,正在通过cx_Oracle推送到数据库。我正在尝试在Python中尽我所能来处理对于对应的数据库类型而言太大的浮点数,而不执行INSERT和处理Oracle错误(因为我想处理字段中的数字,而不是记录中的数字)一次)。我想map(len, repr(num).split('.'))我将最接近浮标的精度和比例吗?

关注者
0
被浏览
216
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    获取小数点左边的位数很容易:

    int(log10(x))+1
    

    由于浮点值固有的不准确性,小数点右边的数字位数比较复杂。我还需要几分钟才能弄清楚那件事。

    编辑: 基于该原理,这是完整的代码。

    import math
    
    def precision_and_scale(x):
        max_digits = 14
        int_part = int(abs(x))
        magnitude = 1 if int_part == 0 else int(math.log10(int_part)) + 1
        if magnitude >= max_digits:
            return (magnitude, 0)
        frac_part = abs(x) - int_part
        multiplier = 10 ** (max_digits - magnitude)
        frac_digits = multiplier + int(multiplier * frac_part + 0.5)
        while frac_digits % 10 == 0:
            frac_digits /= 10
        scale = int(math.log10(frac_digits))
        return (magnitude + scale, scale)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看