2016-04-29 68 views
3

我想隱蔽字符串倍增,並保持相同的值:字符串到雙轉換損失精度在斯威夫特

let myStr = "2.40" 
let numberFormatter = NSNumberFormatter() 
numberFormatter.locale = NSLocale(localeIdentifier: "fr_FR") 
let myDouble = numberFormatter.numberFromString(myStr)?.doubleValue ?? 0.0 

myDouble現在

Double? 2.3999999999999999 

那麼如何轉換「2.40」到確實是2.40雙倍?

更新:

轉換後,即使四捨五入似乎不工作

我不想打印,我想計算和數字應該是正確是很重要的,它的錢計算和費率

+0

http://floating-point-gui.de/ – Moritz

+0

我是知道的,但我想[爲什麼是浮點的解決方案 – iOSGeek

+0

可能的複製數字不準確?](http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-incucurate) – Ben

回答

5

首先:你不!你在這裏遇到的是所謂的浮點不準確。計算機無法精確存儲每個數字。 2.4無法在浮點類型內無損存儲。其次:由於浮點總是一個問題,你在這裏處理金錢(我想你試圖存儲2.4法郎),你的頭號解決方案是:不使用浮點數。。使用從numberFromString得到的NSNumber,並且不要嘗試從中獲得Double
或者將逗號乘以並存儲爲Int

第一個解決方案可能看起來像:

if let num = myDouble { 
    let value = NSDecimalNumber(decimal: num.decimalValue) 
    let output = value.decimalNumberByMultiplyingBy(NSDecimalNumber(integer: 10)) 
} 
+0

有趣的答案,基本上我會乘以轉換的數字彼此和他們然後我會顯示具有2浮點精度的數字,如何與NSNumbe做到這一點r? – iOSGeek

+1

@iOSGeek對於延遲響應抱歉:我稍微編輯了我的答案,以包含一些代碼片斷,它演示了一些計算。顯示該值與浮點精度問題完全分離。爲了顯示值,你可以舍入數值或者讓'NSNumber'處理顯示器,希望*能正確顯示數字。 – luk2302