編輯:這是在 python 2.7.7
有沒有人遇到過這個?我需要將一個鍵值對物件序列化為一個字串,其中每個鍵都包含一個浮點數。
可以有任意數量的條目(在此示例中,我只演示了一個“測驗”)。
似乎在評估整個 object時,Python 可以將小數添加到值中,而當我們獨立地(在物件之外)查看那些完全相同的值時,它們看起來“正常”。
我需要一種方法使最終的序列化物件包含原始值(在本例中為 0.08);或迫使他們進行2DP的手段。
userConstraints = {
"test": 0.08
}
print userConstraints["test"] # Appears ok here
print str(userConstraints) # Has extra DPs here. Why? How to fix?
輸出:
0.8
{'test': 0.080000000000000002}
序列化邏輯(在另一邊)
obj=ast.literal_eval(theSerialisedString)
序列化 obj 的輸出
{'test': 0.080000000000000002}
uj5u.com熱心網友回復:
因此,總而言之,您的 Python 版本和實作repr()對浮點數非常精確。(我們可以說它不是普通的 CPython 2.7.7,因為Python 3.1 中較短的浮點repr()已被向后移植到 CPython 2.7.0中,并且該版本不像你說的那樣做 reprs。)
您用于序列化的有線格式是 Python repr(),并且您想要舍入其中一些冗長的浮點數,原因是。
這沒問題,因為 Python 附帶了reprlib一個用于自定義的模塊repr(在 Python 2 中令人困惑repr)。
等等:
import repr as reprlib # Python 2
import reprlib # Python 3
class TruncatedFloatRepr(reprlib.Repr):
def repr_float(self, x, level):
v = repr(x)
if "." in v:
decimals_after_dot = len(v.partition(".")[-1])
if decimals_after_dot > 5: # Too many decimals? Truncate!
return "%.2f" % x
# Otherwise, use the vanilla `repr`.
return v
userConstraints = {
"test": 0.08000000004,
"hello": ["world", "beep", 3.0, "boop"],
"one": ("two", 1.1),
}
print(TruncatedFloatRepr().repr(userConstraints))
輸出是
{'hello': ['world', 'beep', 3.0, 'boop'], 'one': ('two', 1.1), 'test': 0.08}
當然,您可能需要考慮將其更改5為其他內容,或者計算小數部分中的零個數,或者任何適合您的業務邏輯的東西。事實上,這個實作總是會截斷具有太多小數精度的數字,這可能不是你真正想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/428057.html
標籤:Python python-2.7 铁蟒 点火
