今天有个需求,需要统计浮点数后小数点后的位数。初步想法是将其转化为字符串之后再进行字符串处理。问题是对于下面这类数据而言,转化为str类型后,会变成科学计数法进行表示:
n = 0.0000000001
sn = str(n)
这样就不能直接进行表示了,一般处理小数的位数问题基本上都是自己控制位数,通过decimal
包进行处理即可,今天这个需求有点懵,搜索相关资料,在不改变小数位的情况下,可以有两种解决方案。
numpy.format_float_positional
解决先将浮点数转成字符串类型
判断e
是否在字符串中:
e
不在字符串中,不做处理直接返回
e
在字符串中,进行后续处理
.
和-
如果有的话def float_to_str(f):
float_string = repr(f)
if 'e' in float_string: # detect scientific notation
digits, exp = float_string.split('e')
digits = digits.replace('.', '').replace('-', '')
exp = int(exp)
zero_padding = '0' * (abs(int(exp)) - 1) # minus 1 for decimal point in the sci notation
sign = '-' if f < 0 else ''
if exp > 0:
float_string = '{}{}{}.0'.format(sign, digits, zero_padding)
else:
float_string = '{}0.{}{}'.format(sign, zero_padding, digits)
return float_string
需要使用numpy的函数:format_float_positional
此次numpy版本为1.19,如果出错的话可以看看是不是版本问题, 1.14及以上应该是没问题的
import numpy as np
np.format_float_positional(0.0000000000001)
在能将浮点数准确转化为浮点数后,基于字符串处理是非常容易获得后面的小数位置的,这里不做过多介绍。