python查找小数点后的第一个非零数字

python查找小数点后的第一个非零数字,python,string,floating-point,Python,String,Floating Point,简单的问题,如何找到小数点后的第一个非零数字。我真正需要的是小数点和第一个非零数字之间的距离 我知道我可以用几句话来解决这个问题,但我想用一些通灵的、漂亮的、干净的方法来解决这个问题 到目前为止,我有这个 >>> t = [(123.0, 2), (12.3, 1), (1.23, 0), (0.1234, 0), (0.01234, -1), (0.000010101, -4)] >>> dist = lambda x: str(float(x)).find

简单的问题,如何找到小数点后的第一个非零数字。我真正需要的是小数点和第一个非零数字之间的距离

我知道我可以用几句话来解决这个问题,但我想用一些通灵的、漂亮的、干净的方法来解决这个问题

到目前为止,我有这个

>>> t = [(123.0, 2), (12.3, 1), (1.23, 0), (0.1234, 0), (0.01234, -1), (0.000010101, -4)]
>>> dist = lambda x: str(float(x)).find('.') - 1
>>> [(x[1], dist(x[0])) for x in t]
[(2, 2), (1, 1), (0, 0), (0, 0), (-1, 0), (-4, 0)]

最简单的方法似乎是

x = 123.0
dist = int(math.log10(abs(x)))
我将列表中每对
t
中的第二个条目解释为您想要的结果,因此我选择
int()
将对数四舍五入为零:

>>> [(int(math.log10(abs(x))), y) for x, y in t]
[(2, 2), (1, 1), (0, 0), (0, 0), (-1, -1), (-4, -4)]

关注小数点后的数字的一种方法是删除数字的整数部分,保留小数部分,类似于
x-int(x)

分离出小数部分后,您可以让python使用
%e
演示文稿为您进行计数(这也有助于解决舍入问题)


虽然从技术上讲,这只需一行即可完成(不包括import语句),但我添加了一些额外的内容以使其更加完整

from re import search

# Assuming number is already defined.
# Floats always have a decimal in its string representation.
if isinstance(float, number):
    # This gets the substring of zeros immediately following the decimal point
    # and returns the length of it.
    return len(search("\.(0*)", "5.00060030").group(1))
else:
    return -1
    # or you can use raise TypeError() if you wanna be more restrictive.

这可能与您没有任何关系,但为了完整起见,我想我应该提到它,在某些地区,当涉及到数字时,句号和逗号是交换的。例如,1000000.00可能是1.000.000,00。不确定Python是否承认这一点,但由于它不表示任何带有数千个分隔符的数字,因此可以对其他区域使用模式
,(0*)
。再说一次,这对你来说可能并不重要,但对其他读者来说可能并不重要。

一定要用abs来防止负值(不能记录它们)。@PaulMcGuire:说得好,但因为我还不确定OP想要的是什么,所以我会等一会儿再更新答案。log(0)也不太好。OP可能需要对该值进行特殊处理(提升值错误或返回无穷大?)。我使用了
math.floor
来获得更一致的结果,而不是
int
,我认为应该是
math.ceil
!!!例如
-math.log10(0.0001)=4.0
,以及
math.log10(0.00011)=-2.999
。后者向
-2
四舍五入,这是错误的。请解释它的作用。字符数组中第一个非零值的索引浮动小数部分。最好在答案中包含对代码的解释,这样下一位读者就不需要深入研究注释了
import math
ZerosCount = math.ceil(-math.log10(abs(value) - abs(math.floor(value)))) - 1
import math
ZerosCount = math.ceil(-math.log10(abs(value) - abs(math.floor(value)))) - 1