确定Python中特定数字的精度和小数位数
我在Python中有一个包含浮点数的变量(例如num =
24654.123
),我想确定数字的精度和小数位数(从Oracle的角度来看),因此123.45678应该给我(8,5),12.76应该给我(4,2)等
我最初是在考虑使用字符串表示形式(通过str
或repr
),但是这些操作对于大量失败了(尽管我现在理解的是浮点表示法的局限性才是问题所在):
>>> num = 1234567890.0987654321
>>> str(num) = 1234567890.1
>>> repr(num) = 1234567890.0987654
编辑:
好点在下面。我应该澄清。该数字已经是浮点数,正在通过cx_Oracle推送到数据库。我正在尝试在Python中尽我所能来处理对于对应的数据库类型而言太大的浮点数,而不执行INSERT和处理Oracle错误(因为我想处理字段中的数字,而不是记录中的数字)一次)。我想map(len,
repr(num).split('.'))
我将最接近浮标的精度和比例吗?
-
获取小数点左边的位数很容易:
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)