如何以 f 字符串格式将四舍五入设置为向下?
How to setup rounding halves to down in f-string format?
我正在尝试以这种方式更改我的代码的行为,预期行为:
2249 -> 2.2
2250 -> 2.2
2251 -> 2.3
2349 -> 2.3
2350 -> 2.3
2351 -> 2.4
但是 f'{num:.3g}'
以不同的方式舍入:
from decimal import *
def format_number(num):
getcontext().prec = 1
getcontext().rounding = ROUND_HALF_DOWN
num = Decimal(num)
print(num)
num = float(f'{num:.3g}')
print(num)
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.
num = round(num * 10.) / 10.
return f"{f'{num:f}'.rstrip('0').rstrip('.')}{['', 'k', 'M', 'B', 'T'][magnitude]}"
format_number(2349)
2349
2350.0
'2.4k'
如何更改它并保留 "thouthands to letter" 替换?
您可以将 num 格式的精度宽度更改为 2 而不是 3。这将在精度宽度之后舍入数字。由于您似乎只需要前两位数字的精度,因此它将使用其余数字对这些数字进行四舍五入。
from decimal import *
def format_number(num):
getcontext().prec = 1
getcontext().rounding = ROUND_HALF_DOWN
num = Decimal(num)
#print(num)
num = float(f'{num:.2g}')
#print(num)
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.
num = round(num * 10.) / 10.
return f"{f'{num:f}'.rstrip('0').rstrip('.')}{['', 'k', 'M', 'B', 'T'][magnitude]}"
nums = [2249, 2250, 2251, 2349, 2350, 2351, 2349345, 2351345]
for num in nums:
print(f"{num} -> {format_number(num)}")
输出
2249 -> 2.2k
2250 -> 2.2k
2251 -> 2.3k
2349 -> 2.3k
2350 -> 2.3k
2351 -> 2.4k
2349345 -> 2.3M
2351345 -> 2.4M
我写了一个简单的算法,可以帮助您四舍五入尾随 50 的数字。我没有对其进行广泛的测试,但它通过了您的所有案例。
import math
def round100(x):
return int(math.ceil((x-50.0)/100.0)) / 10.0
input = [2249, 2250, 2251, 2349, 2350, 2351]
for i in input:
print(round100(i))
我正在尝试以这种方式更改我的代码的行为,预期行为:
2249 -> 2.2
2250 -> 2.2
2251 -> 2.3
2349 -> 2.3
2350 -> 2.3
2351 -> 2.4
但是 f'{num:.3g}'
以不同的方式舍入:
from decimal import *
def format_number(num):
getcontext().prec = 1
getcontext().rounding = ROUND_HALF_DOWN
num = Decimal(num)
print(num)
num = float(f'{num:.3g}')
print(num)
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.
num = round(num * 10.) / 10.
return f"{f'{num:f}'.rstrip('0').rstrip('.')}{['', 'k', 'M', 'B', 'T'][magnitude]}"
format_number(2349)
2349
2350.0
'2.4k'
如何更改它并保留 "thouthands to letter" 替换?
您可以将 num 格式的精度宽度更改为 2 而不是 3。这将在精度宽度之后舍入数字。由于您似乎只需要前两位数字的精度,因此它将使用其余数字对这些数字进行四舍五入。
from decimal import *
def format_number(num):
getcontext().prec = 1
getcontext().rounding = ROUND_HALF_DOWN
num = Decimal(num)
#print(num)
num = float(f'{num:.2g}')
#print(num)
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.
num = round(num * 10.) / 10.
return f"{f'{num:f}'.rstrip('0').rstrip('.')}{['', 'k', 'M', 'B', 'T'][magnitude]}"
nums = [2249, 2250, 2251, 2349, 2350, 2351, 2349345, 2351345]
for num in nums:
print(f"{num} -> {format_number(num)}")
输出
2249 -> 2.2k
2250 -> 2.2k
2251 -> 2.3k
2349 -> 2.3k
2350 -> 2.3k
2351 -> 2.4k
2349345 -> 2.3M
2351345 -> 2.4M
我写了一个简单的算法,可以帮助您四舍五入尾随 50 的数字。我没有对其进行广泛的测试,但它通过了您的所有案例。
import math
def round100(x):
return int(math.ceil((x-50.0)/100.0)) / 10.0
input = [2249, 2250, 2251, 2349, 2350, 2351]
for i in input:
print(round100(i))