如何在Swift中獲得浮點數的小數精度?所有現有的答案都使用某種形式的字符串轉換,效率不高。我正在尋找一種不涉及字符串轉換的方法。如何獲得浮點數的小數精度?
這個問題是基於一種誤解。我已經意識到並糾正了我的理解錯誤,感謝@MartinR和@SimonByrne。
如何在Swift中獲得浮點數的小數精度?所有現有的答案都使用某種形式的字符串轉換,效率不高。我正在尋找一種不涉及字符串轉換的方法。如何獲得浮點數的小數精度?
這個問題是基於一種誤解。我已經意識到並糾正了我的理解錯誤,感謝@MartinR和@SimonByrne。
正如其他評論者指出的那樣,浮點數的「小數精度」實際上並不存在:當您編寫像x = 0.123
這樣的東西時,您確實將x
設置爲最接近的雙精度浮點浮點數到0.123,這是一個事實:
0.1229999999999999982236431605997495353221893310546875
根據您提出的答案,你的問題會更精確地說是計算在小數近似小數的最小數量到浮點數。
對於這個代碼應該是「合理」的價值觀是正確的,但如果你有超過22位小數,你可能會看到一些錯誤,如tens
變量將不再是準確的(10 不能完全代表由雙精度浮動)。有關這方面的更多詳細信息,您應該閱讀二進制到十進制的轉換:我建議看一下Rick Regan的網頁: http://www.exploringbinary.com/tag/convert-to-decimal/
這是如何做到這一點:
func getPrecision(valueFunction: (@autoclosure() -> Double)) -> Int
{
let value = valueFunction()
var tens: Double = 1.0
var precision: Int = 0
while (floor((value * tens) + 0.1)/tens) != value
{
tens *= 10
precision++
}
return precision
}
這個答案是錯誤的,因爲正確地指出由西蒙·伯恩。
查看我的其他答案:您還可以通過簡單地檢查「value * tens」是否爲整數值來簡化檢查。 –
您能否精確(雙關語:)您認爲浮點數的精度是什麼?從你的答案我假設你正在談論*十進制*精度。但是Float和Double使用二進制表示,這意味着像0.123 *這樣的數字不能準確表示,它更像0.12299999999999999822。 –
請注意,您提出的解決方案給出'getPrecision(0.123 + 3.456)'的結果'15',這可能是意想不到的。 –
不要誤會我的意思:您的問題和答案都可能有用,但您應該準確定義您計算的內容。 –