[英]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.