如何在f字符串格式中设置从四舍五入到下



我正试图以这种方式更改代码的行为,预期行为:

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))

最新更新