如何以 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))