无科学记数法和双舍入

Posted

技术标签:

【中文标题】无科学记数法和双舍入【英文标题】:No scientific notation and rounding with double 【发布时间】:2017-10-19 18:53:53 【问题描述】:

我想将一个数字四舍五入到 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 位的值。

【问题讨论】:

"但如果我这样做,它会返回一个字符串" – 科学记数法在将数字转换为字符串时使用。 当然Double 不能准确表示所有小数,这可能是您的问题的一部分。 是的,但这会返回一串永远存在的数字,但我只想将数字显示到前 6 个位置。如果返回的字符串太长,那么我仍然必须将其剪掉。我知道我可以操纵字符串,但我觉得有更好的方法可以做到这一点。 NumberFormatter 具有诸如 maximumFractionDigits 之类的属性来控制转换... 我试过了,也没有用let numberFormatter = NumberFormatter(); numberFormatter.numberStyle = NumberFormatter.Style.decimal; numberFormatter.maximumFractionDigits = 6 【参考方案1】:

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:)(即使编译器建议 它作为一个修复它!),它几乎永远不会做你需要的。

【讨论】:

太棒了!看来这对我来说是一个愚蠢的错误。感谢您提供有关 String(describing:) 的提示,我一定会牢记这一点。

以上是关于无科学记数法和双舍入的主要内容,如果未能解决你的问题,请参考以下文章

保存和比较 MATLAB 的舍入数字

从科学记数法到十进制记数法的数值

printf %e 科学记数法在 C 中给出错误值

r 科学计数法限制尾数小数点

如何在 Pandas Dataframe Python 中使用科学计数法显示小数字?

qgis双精度怎么弄