2017-10-19 81 views
0

我想將數字舍入到6個位置,我不希望它使用科學記數法顯示。我正在使用此代碼將小數點四捨五入到6位,但如果該值非常小,它仍然使用科學記數法顯示它。我知道我可以使用數字格式化程序(下面也顯示)去除科學記數法,但如果我這樣做,那麼它會返回一個字符串,所以我不能將一個字符串四捨五入到一定的小數位數。如果我先做四捨五入,那在所有情況下都不起作用。它仍然顯示了一些數字,沒有四捨五入。達到此目的的最佳方法是什麼?它應該在所有不同的場景在哪裏工作數字是無限長或重複沒有科學記數法和雙舍入法

extension Double { 
    // Rounds the double to decimal places value 
    func rounded(toPlaces places:Int) -> Double { 
     let divisor = pow(10.0, Double(places)) 
     return (self * divisor).rounded()/divisor 
    } 
} 




let numberFormatter = NumberFormatter() 
numberFormatter.numberStyle = NumberFormatter.Style.decimal 
numberFormatter.number(from:"") 

我試圖用這個代碼

let currentValue = 1/2.3344 //answer is 0.42837559972584... 
let numberFormatter = NumberFormatter() 
numberFormatter.numberStyle = NumberFormatter.Style.decimal 
numberFormatter.maximumFractionDigits = 6 
guard let finalNum = numberFormatter.number(from: String(describing: currentValue)) else {return nil} 
text = String (describing: finalNum) 

我希望它顯示0.428375。該值四捨五入至小數點後6位。

當前值爲:let currentValue = 1/233442即0.00000428371 ...我希望它顯示0.000004。小數四捨五入到小數點後6位,而不是科學記數法。

噹噹前值是這樣的:let currentValue = 1/2334429我希望它顯示0,因爲這是四捨五入到小數點後6位的值。

+0

*「但如果我這樣做,那麼它返回一個字符串」* - 科學記數法*僅*用於將數字轉換爲字符串時使用。 –

+0

當然'雙'*不能*完全代表所有的小數部分,這可能是你的問題的一部分。 –

+0

是的,但是這會返回一串永遠持續的數字,但我只想顯示數字前6位。如果返回的字符串太長,我仍然必須將其剪下。我知道我可以操作字符串,但我覺得有一個更好的方法可以讓我做到這一點。 –

回答

3

number(from: someString)方法的字符串轉換爲數字, 你想讓它周圍的其他方法:

let currentEntry = 1/2.3344 

let numberFormatter = NumberFormatter() 
numberFormatter.numberStyle = .decimal 
numberFormatter.maximumFractionDigits = 6 

guard let text = numberFormatter.string(for: currentEntry) else { 
    // ... 
} 
print(text) // 0.428376 

請注意,您String(describing:)轉換隻隱藏的問題。 你真的應該避免String(describing:)(即使編譯器建議 它是Fix-it!),它幾乎不會做你所需要的。

+0

太棒了!看起來這是我的一個愚蠢的錯誤。感謝關於String的小技巧(描述:)'我一定會牢記這一點。 –