使用Python对科学计数法进行四舍五入

31

我在Python中有一个数字,例如2.32432432423e25,它是计算的结果。

我想将其四舍五入到小数点后3位以获得输出:

2.324e25

我曾尝试使用:

x = 2.32432432423e25 
number_rounded = round(x, 3)

但是当我打印number_rounded时,它输出的数字格式与x相同。

我如何将x的显示限制为仅4个有效数字?

4个回答

37
您需要使用字符串格式化来实现这个功能: '{:0.3e}'.format(2.32432432423e25) 原因是round函数是用来指定小数点后的位数,但当您的数字是 O(25)级别时,这不是很相关。

10

如果您想使用 Python 3.6 引入的 f-string 语法,请在变量后面指定格式,用 : 分隔,例如:

>>> res = 2.32432432423e25
>>> f'The result is {res:.3e}'
'The result is 2.324e+25'

3

我在寻找答案时,大部分都是字符串的回答。虽然通常最好的方法是处理这个问题(因为浮点数总是根据其定义精度四舍五入),但有时你希望将浮点数舍入到给定的小数精度(再加上任何浮点数不确定性)而我找不到一个好的答案。以下是我想到的,我相信它处理了所有可能的情况:输入为零,输入小于1,输入大于1,对于正数和负数:

def precision_round(number, digits=3):
    power = "{:e}".format(number).split('e')[1]
    return round(number, -(int(power) - digits))

感谢您的函数。F-string版本为:power = F"{number:e}".split('e')[1] - Alireza Amani

1

在@Josh Duran的好函数/想法基础上,这里是同样的函数,可以处理高达2-D数组。也许有人可以修改它以适应ndarrays。


def precision_round(numbers, digits = 3):
    '''
    Parameters:
    -----------
    numbers : scalar, 1D , or 2D array(-like)
    digits: number of digits after decimal point
    
    Returns:
    --------
    out : same shape as numbers
    '''
    import numpy as np

    numbers = np.asarray(np.atleast_2d(numbers))
    out_array = np.zeros(numbers.shape) # the returning array
    
    for dim0 in range(numbers.shape[0]):
        powers = [int(F"{number:e}".split('e')[1]) for number in numbers[dim0, :]]
        out_array[dim0, :] = [round(number, -(int(power) - digits))
                         for number, power in zip(numbers[dim0, :], powers)]
        
    # returning the original shape of the `numbers` 
    if out_array.shape[0] == 1 and out_array.shape[1] == 1:
        out_array = out_array[0, 0]
    elif out_array.shape[0] == 1:
        out_array = out_array[0, :]
    
    return out_array


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接