圆形到python中的重要数字

时间:2017-07-18 23:10:23

标签: python rounding

我想像这样绕圈42949672 - > 42949700,2147483647 - > 2147480000,4252017622 - > 4252020000等。

我尝试使用以下内容,但仅适用于第一个。我怎样才能制作更一般的?感谢

round(42949672, -2)

4 个答案:

答案 0 :(得分:1)

我假设你想要得出6位有效数字。如果你想要围绕int,你可以使用

def round_sf(number, significant):
    return round(number, significant - len(str(number)))

print(round_sf(4252017622, 6))

结果:

4252020000

答案 1 :(得分:1)

为了扩展Autumn的回答,在一般情况下接受的答案失败的原因是round四舍五入到小数位而不是(必然)到有效数字。

以下函数解决了小数点前后都有有效数字的情况:

import math
def round_to_nsf(number, nsf=6):
    integer_part = math.floor(number)
    return round(number, nsf - len(str(integer_part)))

尽管它没有解决像 0.0000012345678 这样四舍五入为 6 s.f 的数字的情况。应该是 0.00000123457。

以下代码几乎有效 - 但效率非常低,通过使用递归存在堆栈溢出的风险,并且由于计算机使用二进制算术而不是十进制,因此不会总是返回正确答案:

def round_to_nsf(number, nsf=6):
    integer_part = math.floor(number)
    if integer_part > 0:
        return round(number, nsf - len(str(integer_part)))
    else:
        return round_to_nsf(10 * number, nsf) / 10

但我认为可以通过将数字转换为字符串来修改 else 子句,在单个递归步骤中使用 main 函数,然后构造从字符串以获得非循环小数。

答案 2 :(得分:0)

要舍入到您定位的任何数字,您只需将数字作为负数放在圆函数中,然后将其转换为整数。

digits = 4
num = 2147483647
rounded_num = int(round(num, -digits))

如果你总是试图保留6位有意义的数字,这就是我在你的问题中看到的模式,你会想要这样做:

def sf_round(num, sig_fig):
    return int(round(num, -(len(str(num))-sig_fig)))

答案 3 :(得分:0)

公认的答案是有局限性的,在一般情况下不会产生技术上正确的有效数字。

numpy.format_float_positional直接支持所需的行为。以下片段返回浮点数x,其格式为4个有效数字,但不包含科学计数法。

import numpy as np
x=12345.6
np.format_float_positional(x, precision=4, unique=False, fractional=False, trim='k')
> 12340.