我在 Python 中有一个包含浮点数的变量(例如num = 24654.123
),并且我想确定数字的精度和小数位数(在 Oracle 意义上),因此 123.45678 应该给我 (8,5),12.76 应该给我 (4,2),等等。
我首先考虑使用字符串表示(通过str
or repr
),但是对于大数字来说这些会失败(尽管我现在明白这是浮点表示的限制,这就是这里的问题):
>>> num = 1234567890.0987654321
>>> str(num) = 1234567890.1
>>> repr(num) = 1234567890.0987654
Edit:
下面有好点。我应该澄清一下。该数字已经是浮点数,并通过 cx_Oracle 推送到数据库。我正在尝试在 Python 中尽我所能来处理对于相应数据库类型来说太大的浮点数,而不是执行 INSERT 和处理 Oracle 错误(因为我想处理字段中的数字,而不是记录中的数字)一次)。我猜map(len, repr(num).split('.'))
我能得到的最接近浮点数的精度和规模吗?
获取小数点左边的位数很容易:
int(log10(x))+1
由于浮点值固有的不准确性,小数点右侧的位数更加棘手。我还需要几分钟才能弄清楚这一点。
Edit:基于这个原则,这里是完整的代码。
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)