在不舍入的情况下截断 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)的情况......这会四舍五入并阻碍我们文本截断。
我想打印一个非常非常接近一个的浮点数,将其截断到小数点后两位而不四舍五入,最好使用尽可能少的代码。
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)的情况......这会四舍五入并阻碍我们文本截断。