2017-10-19 42 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的小技巧(描述:)'我一定会牢记这一点。 –