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

时间:2018-02-06 16:14:40

标签: swift number-formatting

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"

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

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

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

首先,您需要字符串表示的值。为此,请将其转换为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。这避免了十进制/二进制舍入,但对于某些类型的数学来说不太方便和慢。如果这是一种以基数为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