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

新手上路,请多包涵

我在 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('.')) 是我最接近浮点数的精度和比例吗?

原文由 jrdioko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 596
2 个回答

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

 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)

原文由 Mark Ransom 发布,翻译遵循 CC BY-SA 2.5 许可协议

浮点变量不可能。例如,键入

>>> 10.2345

给出:

 10.234500000000001

因此,要从中得到 6,4,您必须找到一种方法来区分输入 10.234510.234500000000001 的用户,这是不可能使用浮点数的。这与浮点数的存储方式有关。使用 decimal

 import decimal
a = decimal.Decimal('10.234539048538495')
>>> str(a)
'10.234539048538495'
>>>  (len(str(a))-1, len(str(a).split('.')[1]))
(17,15)

原文由 Chinmay Kanchi 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题