今天有个需求,需要统计浮点数后小数点后的位数。初步想法是将其转化为字符串之后再进行字符串处理。问题是对于下面这类数据而言,转化为str类型后,会变成科学计数法进行表示:
n = 0.0000000001 sn = str(n)
这样就不能直接进行表示了,一般处理小数的位数问题基本上都是自己控制位数,通过decimal包进行处理即可,今天这个需求有点懵,搜索相关资料,在不改变小数位的情况下,可以有两种解决方案。
解决办法- 编写函数,使其能够处理这类科学计数表示的字符串
- 使用numpy的numpy.format_float_positional解决
-
先将浮点数转成字符串类型
-
判断e是否在字符串中:
-
e不在字符串中,不做处理直接返回
-
e在字符串中,进行后续处理
- 先基于e划分整数位和指数位
- 整数位进行一些字符串替换处理,去掉.和- 如果有的话
- 指数为先转成整数后再进行处理
- 基于指数值进行处理,得到n-1个0
- 符号位基于float本身来确定
- 如果指数位大于0, 表明是的值,数的组成为 符号位 + 整数位 + 补零
- 如果指数位小于0, 表明是小数,数的组成为 符号位 + 补零 + 整数位
-
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
需要使用numpy的函数:format_float_positional
此次numpy版本为1.19,如果出错的话可以看看是不是版本问题, 1.14及以上应该是没问题的
import numpy as np np.format_float_positional(0.0000000000001)
在能将浮点数准确转化为浮点数后,基于字符串处理是非常容易获得后面的小数位置的,这里不做过多介绍。
参考- https://numpy.org/doc/stable/reference/generated/numpy.format_float_positional.html
- https://stackoverflow.com/questions/38847690/convert-float-to-string-in-positional-format-without-scientific-notation-and-fa



