繁体   English   中英

在 python 中四舍五入到有效数字

[英]Round to significant figures in python

我想像这样四舍五入 42949672 -> 42949700、2147483647 -> 2147480000、4252017622 -> 4252020000 等。

我尝试使用以下,但只适用于第一个。 我怎样才能做一个更通用的? 谢谢

round(42949672, -2)

我想像这样四舍五入为42949672-> 42949700,2147483647-> 2147480000,4252017622-> 4252020000等

我尝试使用following,但仅适用于第一个。 我该如何做一个更通用的? 谢谢

round(42949672, -2)

我想像这样四舍五入为42949672-> 42949700,2147483647-> 2147480000,4252017622-> 4252020000等

我尝试使用following,但仅适用于第一个。 我该如何做一个更通用的? 谢谢

round(42949672, -2)

我想像这样四舍五入为42949672-> 42949700,2147483647-> 2147480000,4252017622-> 4252020000等

我尝试使用following,但仅适用于第一个。 我该如何做一个更通用的? 谢谢

round(42949672, -2)

我想像这样四舍五入为42949672-> 42949700,2147483647-> 2147480000,4252017622-> 4252020000等

我尝试使用following,但仅适用于第一个。 我该如何做一个更通用的? 谢谢

round(42949672, -2)

在@david-joy 的 function 上扩展。 事实上,它在 else 子句中不能正常工作,实际上并不是所有情况都包含在 if 子句中。 所以这是我的 function。

def round_to_nsf(number, nsf=2):
    integer_part = math.floor(number)
    if integer_part > 0:
        integer_part_len = len(str(integer_part))
        return round(number, nsf-integer_part_len)
    else:
        st = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}
        index = next((i for i, ch in enumerate(str(number)) if ch in st), None)
        return round(number, index)

这些对我有用,适用于正数和负数的整数和浮点数。 如果需要,可以通过将 isinstance() 应用于 x 然后返回 int() 或 float() 来修改它们以保留原始 int 或 float 类型。

请注意,超过 14 位数字的格式可能会产生意想不到的结果。

# Option 1: use math
import math
def rnd1(x, sigdig=14):
    """Round x to sigdig significant digits"""
    # n = digits to the left of decimal, can be negative
    n = math.floor(math.log10(abs(x))) + 1
    return round(x, sigdig - n)

# Option 2: use format which also rounds
def rnd2(x, sigdig=14):
    """Round x to sigdig significant digits"""
    f = f'{{:.{sigdig - 1}E}}'
    s = f.format(x)
    return float(s)

# Bonus: use format to truncate
def sig(x, sigdig=14):
    """Truncate x to sigdig significant digits"""
    f = f'{{:.{sigdig}E}}'
    s = f.format(x)
    decimal= 1
    minus = 1 if x < 0 else 0
    s = ''.join( (s[:sigdig + minus + decimal], s[s.index('E'):]) )
    return float(s)

# Unexpected format results with large number of significant digits
>>> '{:.20E}'.format(10**-1)
'1.00000000000000005551E-01'

>>> '{:.20E}'.format(10**-10)
'1.00000000000000003643E-10'

>>> '{:.20E}'.format(10**-20)
'9.99999999999999945153E-21'

>>> n = .123456789012345678901234567890
>>> '{:.20E}'.format(n)
'1.23456789012345677370E-01'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM