簡體   English   中英

python 3 中的浮點格式

[英]floating point formatting in python 3

我一直在研究,但我找不到一個簡單的解決方案來執行以下行為。 我想將浮點數舍入到特定位置並將結果作為字符串(最好是原始字符串)。 具體來說,我想要四舍五入的數字可能會從小數點開始,在這種情況下我希望結果不包括小數點。

例子

to_string_(x: float, prec: int): ...
# Results should look like:
>>> to_string_(1.2345e2, 3)
123.450
>>> to_string_(1.2345e2, 2)
123.45
>>> to_string_(1.2345e2, 1)
123.5
>>> to_string_(1.2345e2, 0)
123
>>> to_string_(1.2345e2, -1)
120
>>> to_string_(1.2345e2, -2)
100
>>> to_string_(1.2345e2, -3)
0
>>> to_string_(1.2345e-1, 0)
0
>>> to_string_(1.2345e-1, 1)
0.1
>>> to_string_(1.2345e-1, 6)
0.123450

我知道

def to_string(x: float, prec: int):
    return ((f"%.{prec}f") % x)

會在某些示例中起作用,但不適用於負 prec。 先感謝您。

一旦值為負數,將您的值轉換為 integer 然后將其截斷為適當的精度可能會更容易。 prec<=0時,你可以通過取10 ** (-prec)來獲得數字的分辨率示例:

def to_string(x: float, prec: int):
    if prec > 0:
        return f"{x:.{prec}f}"
    else:
        res = 10 ** (-prec)
        return str(int(x / res) * res)


for i in range(-3, 4)[::-1]:
    print(i, ":", to_string(1.2345e2, i))
3 : 123.450
2 : 123.45
1 : 123.5
0 : 123
-1 : 120
-2 : 100
-3 : 0

如果您對負值進行不同的舍入,您自己的解決方案就可以正常工作。

def to_string(x: float, prec: int):
    if prec < 0:
        x = round(x, prec)
        prec = 0
    return ((f"%.{prec}f") % x)

請注意, function 和 f 弦的round可能與您預期的不同。 他們使用一種稱為half to even的模式(也稱為 Banker's rounding),它會影響以 5 結尾的數字的舍入方式。 例如, f'{1.5:.0f}'f'{2.5:.0f}'都會產生'2' ,因為 2 是偶數而 3 不是。

這是一個使用decimal模塊的解決方案。 請注意,如果可以的話,對於最典型的預期行為,您可能希望使用decimal.Decimal對象而不是float (將字符串或元組傳遞給構造函數,而不是 float)作為開頭。 您也可以指定所需的舍入類型(查看decimal文檔以了解如何執行此操作):

>>> from decimal import Decimal as _Decimal
>>> def to_string_(x: float, prec: int) -> str:
...     d = _Decimal(x).quantize(_Decimal((0, (1,), -prec)))
...     return f"{d:f}"
...
>>> to_string_(1.2345e2, 3)
'123.450'
>>> to_string_(1.2345e2, 2)
'123.45'
>>> to_string_(1.2345e2, 1)
'123.5'
>>> to_string_(1.2345e2, 0)
'123'
>>> to_string_(1.2345e2, -1)
'120'
>>> to_string_(1.2345e2, -2)
'100'
>>> to_string_(1.2345e2, -3)
'0'
>>> to_string_(1.2345e-1, 0)
'0'
>>> to_string_(1.2345e-1, 1)
'0.1'
>>> to_string_(1.2345e-1, 6)
'0.123450'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM