gpt4 book ai didi

python - 如何通过智能地选择正确的小数位进行四舍五入,在 python 中 "fix" float ?

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:59 24 4
gpt4 key购买 nike

我在这里看到了很多关于在 python 中舍入浮点值或类似主题的讨论,但我有一个相关的问题,我需要一个好的解决方案。

上下文:

我使用 netCDF4 python 库从 NetCDF 文件中提取数据。我的组织对这些文件中的变量保留了精度属性。

示例:TS:data_precision = 0.01f ;

我使用这样的库收集这些精度属性:

d = netCDF4.Dataset(path) # assume path is the file or url link
precisions = {}
for v in d.variables:
try:
precisions[v] = d.variables[v].__getattribute__('data_precision')
except AttributeError:
pass
return precisions
<小时/>

当我从数据集中检索这些精度值时,在 python 中它们最终显示为:

{u'lat': 9.9999997e-05, u'lon': 9.9999997e-05, u'TS': 0.0099999998, u'SSPS': 0.0099999998}

但是,我真正想要的是:

{u'lat': 0.0001, u'lon': 0.0001, u'TS': 0.01, u'SSPS': 0.01}
<小时/>

本质上,我需要一种Python方法来智能地将这些值四舍五入到最合适的小数位。我确信我可以想出一个非常丑陋的方法来做到这一点,但我想知道是否已经有一个“好的”解决方案来解决这个问题。

对于我的用例,我想我可以利用这样一个事实:由于这些值都是“data_ precision”值,我可以从小数点开始计算零,然后四舍五入到最后一个 0。(I'我假设 0 < n < 1 )。有了这些假设,这将是我的解决方案:

#/usr/bin/python

def intelli_round(n):
def get_decimal_place(n):
count = 0
while n < 1:
n *= 10
count += 1
return count
return round(n, get_decimal_place(n))

examples = [0.0099999, 0.00000999, 0.99999]
for e in examples:
print e, intelli_round(e)

.

0.0099999 0.01
9.99e-06 1e-05
0.99999 1.0

这看起来合适吗?它似乎在限制下工作,但我很好奇看到替代方案。

最佳答案

感谢本杰明将上面评论中的另一篇文章链接到我正在寻找的解决方案。表达我的问题的更好方法是,我想对浮点值进行操作,以便只保留 1 个有效数字。

简单的例子:

0.00999  -> 0.01
0.09998 -> 0.1
0.00099 -> 0.001

This solution非常适合我的需求:

>>> from math import log10, floor
>>> def round_to_1(x):
... return round(x, -int(floor(log10(abs(x)))))

它可以很好地处理我的特定上下文( 1.0e^p, p < 0 )内的输入,非常感谢您的帮助!

关于python - 如何通过智能地选择正确的小数位进行四舍五入,在 python 中 "fix" float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com