我想像这样绕圈42949672 - > 42949700,2147483647 - > 2147480000,4252017622 - > 4252020000等。
我尝试使用以下内容,但仅适用于第一个。我怎样才能制作更一般的?感谢
round(42949672, -2)
答案 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.