简单查找小数位数的方法

99 投票
16 回答
144345 浏览
提问于 2025-04-16 18:41

有没有简单的方法或者内置的功能可以找出一个浮点数的小数位数呢?

这个数字是从一个字符串中解析出来的,所以一种方法是数一下小数点后面的数字,但我觉得这样做有点麻烦。有没有可能从一个 float 或者 Decimal 对象中获取到需要的信息呢?

16 个回答

8

我找到的最快的方法来计算小数点后面的数字并对数字进行四舍五入是:

计算数字:

a=decimal.Decimal('56.9554362669143476');
lenstr = len(str(a).split(".")[1])

计算、检查和四舍五入:

a=decimal.Decimal('56.9554362669143476');
a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a)

比较:

$ python2 -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); round(float(a),5) if a.as_tuple().exponent < -5 else float(a)'
10000 loops, best of 3: 32.4 usec per loop
$ python -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a)'
100000 loops, best of 3: 16.7 usec per loop
17

“小数位数”并不是浮点数的一个属性,因为它们在内部存储和处理的方式决定了这一点。

你可以从浮点数中获取任意数量的小数位,关键在于你想要多准确。当把浮点数转换成字符串时,过程的一部分就是决定准确度。

比如你可以试试:

1.1 - int(1.1)

你会看到答案是:

0.10000000000000009

在这个例子中,小数位数是17。这可能不是你想要的数字。

不过,你可以用“round”函数把数字四舍五入到特定的小数位:

round(3.1415 - int(3.1415), 3)

在这个例子中,小数位数被缩减到3。

你不能直接从浮点数中获取“小数位数”,但你可以决定准确度和想要的小数位数。

把浮点数转换成字符串就是做出这种决定的一种方式。

128

我想重复一下别人说过的话(因为我已经打出来了!),我不太确定在浮点数的情况下,这样的值是否有意义,因为十进制和二进制的表示方式不同;通常,一个用有限的十进制数字表示的数字,在二进制中可能只有无限位的表示。

对于一个 decimal.Decimal 对象,你可以使用 as_tuple 方法来获取它的指数,这个方法会返回一个包含 sign(符号)、digits(数字)和 exponent(指数)属性的命名元组:

>>> d = decimal.Decimal('56.4325')
>>> d.as_tuple().exponent
-4

>>> d = decimal.Decimal('56.43256436')
>>> d.as_tuple().exponent
-8

>>> d = decimal.Decimal(str(56.4325))
>>> d.as_tuple().exponent
-4

指数的相反数就是小数点后面的数字位数,前提是这个指数大于 0

撰写回答