我正在處理一些就地顯示的格式化用戶存儲的浮點數的就地代碼。Python格式字符串和浮點表示法
當前實現做到這一點:
"{0:.24f}".format(some_floating_point).rstrip('0')
這是有道理的和工作得很好大部分。但是當遇到像0.0003
這樣的價值時,情況就不一樣了。
>>> "{0:.24f}".format(0.0003).rstrip('0')
'0.000299999999999999973719'
一些進一步的調查表明,Python似乎根據請求的位數改變了底層表示法?
>>> "{0:.15f}".format(0.0003)
'0.000300000000000'
>>> "{0:.20f}".format(0.0003)
'0.00029999999999999997'
我的假設是單精度vs雙精度。
用戶輸入這些值作爲double值存儲在數據庫中,並且稍後再次呈現表單時,相同的值將在字段中預先填充。因此我需要這些表示的1:1映射。
因此,我的問題是:什麼是處理這種行爲的優雅,更重要的安全方法?迄今爲止我所做的最大努力都涉及到log10,並且不太理想地把它放在很好的位置。
編輯:由於Prune指出價值並沒有真正改變,而是由格式完成的舍入將繼續導致一組9個變爲0(德)。這種行爲是有道理的,但解決方案仍在逃避我。
沒有一個優雅的解決這一點,它在基地2座10我可以提供答案之間的差別所固有的,但它也需要日誌10 - 你需要限制的位數格式要比存儲在double中的有效數字少一個。 –