2015-01-16 63 views
0

如何在Swift中獲得浮點數的小數精度?所有現有的答案都使用某種形式的字符串轉換,效率不高。我正在尋找一種不涉及字符串轉換的方法。如何獲得浮點數的小數精度?


這個問題是基於一種誤解。我已經意識到並糾正了我的理解錯誤,感謝@MartinR和@SimonByrne。

+0

您能否精確(雙關語:)您認爲浮點數的精度是什麼?從你的答案我假設你正在談論*十進制*精度。但是Float和Double使用二進制表示,這意味着像0.123 *這樣的數字不能準確表示,它更像0.12299999999999999822。 –

+2

請注意,您提出的解決方案給出'getPrecision(0.123 + 3.456)'的結果'15',這可能是意想不到的。 –

+0

不要誤會我的意思:您的問題和答案都可能有用,但您應該準確定義您計算的內容。 –

回答

2

正如其他評論者指出的那樣,浮點數的「小數精度」實際上並不存在:當您編寫像x = 0.123這樣的東西時,您確實將x設置爲最接近的雙精度浮點浮點數到0.123,這是一個事實:

0.1229999999999999982236431605997495353221893310546875

根據您提出的答案,你的問題會更精確地說是計算在小數近似小數的最小數量到浮點數。

對於這個代碼應該是「合理」的價值觀是正確的,但如果你有超過22位小數,你可能會看到一些錯誤,如tens變量將不再是準確的(10 不能完全代表由雙精度浮動)。有關這方面的更多詳細信息,您應該閱讀二進制到十進制的轉換:我建議看一下Rick Regan的網頁: http://www.exploringbinary.com/tag/convert-to-decimal/

0

這是如何做到這一點:

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 
} 

這個答案是錯誤的,因爲正確地指出由西蒙·伯恩。

+0

查看我的其他答案:您還可以通過簡單地檢查「value * tens」是否爲整數值來簡化檢查。 –