如何将指数值转换为十进制值

How to convert Exponential Value to Decimal Value

let balance = "2.477854178281608e-06" 
// I have to convert this exponential value in Decimal

/* 已经尝试了下面提到的解决方案,但没有用 */

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let finalNumber = numberFormatter.number(from: balance)
print(finalNumber!)

值正在打印“2.477854178281608e-06\n”

任何帮助将不胜感激。

let balance = "2.477854178281608e-06" 
// I have to convert this exponential value in Decimal

这不是指数值。这是一个字符串,表示使用指数格式的数字。您似乎想要一个以不同格式表示相同数字的字符串。这里重要的是,两个字符串都不是 "the value." 无论表示形式如何,值都是相同的(或者如果表示形式有限,则大致相同)。

所以首先你需要字符串表示的值。为此,请将其转换为 Double。

let value = Double(balance)!

现在,您说要将其转换为十进制格式的字符串(我假设您的意思是 0.000...)。所以你需要一个格式化程序:

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 20
let string = numberFormatter.string(for: value)!
print(string)  // 0.00000247785417828161

您会注意到此值与之前的值略有不同。这是因为在处理这么小的值时存在舍入误差。


如果所有这些以 10 为基数的数字都很重要,您可以使用 Decimal 类型而不是 Double。这避免了 decimal/binary 舍入,但对于某些类型的数学而言不太方便且速度较慢。如果这是一种以 10 为基数的货币(基本上是所有单位),您总是希望使用 Decimal 而永远不要使用 Double.

let balance = "2.477854178281608e-06"
let value = Decimal(string: balance)!

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 21
let string = numberFormatter.string(for: value)!
print(string)  // 0.000002477854178281608