在不舍入的情况下截断 f 字符串浮点数

Truncate f-string float without rounding

我想打印一个非常非常接近一个的浮点数,将其截断到小数点后两位而不四舍五入,最好使用尽可能少的代码。

a = 0.99999999999
print(f'{a:0.2f}')
Expected: 0.99
Actual: 1.00

如果我没理解错的话,我认为您不需要 f 字符串或数学函数。简单的旧字符串操作应该可以帮助您:

a = 0.987654321
print(str(a)[:4])

输出:

0.98

在 python 方面不够熟练,但肯定这里的浮点数学足够接近 C - 我精通。

Python 的 float,就像 C 的 double 是基数 2,所以像 0.xx 这样的值,除了 0.00, 0.25, 0.50, 0.75 不能被精确编码。

让我们试试a=0.87。最接近的可表示 python float 值是:

 # 1234567890123456789012  
 0.8699999999999999955591...

所以真实值小于 0.87。

打印少于 18 位数字(str() 显然如此)会导致四舍五入的输出。

 # 12345678901234567
 0.87000000000000000

并进行文本截断导致 "0.87",但不符合 "truncating it to 2 decimal places without rounding",因为原始值为 0.8699999999999999955591...

要解决,代码需要在调用 str() 之前更改 float 数学的舍入模式以向 0 舍入而不是舍入到最近的 转换为具有更高精度的字符串。我怀疑 python 可以做到这一点 - 我不知道。

即使有更高的精度(仍然使用四舍五入到最近),在一般情况下,仍然可能存在真实值为 xxx.xx(许多 9)的情况......这会四舍五入并阻碍我们文本截断。