【问题标题】:How to convert Exponential Value to Decimal Value如何将指数值转换为十进制值
【发布时间】:2018-07-16 18:29:36
【问题描述】:
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 value = Double(balance),大概……
  • @kd02 我想要最多 5 位小数。实际转换后的值将是我使用在线转换器找到的“0.000002477854178281608”。
  • 知道如果您使用 5 位小数,则示例中该数字的值为“0.00000”
  • @holex 如果你标记为重复,你应该提供一个有效的链接来给出解决方案。刚刚检查了您的解决方案,但没有工作。

标签: swift number-formatting


【解决方案1】:
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

【讨论】:

  • 很好解释。工作。
  • 不需要初始化一个新的NSNumber或者NSDecimalNumber,可以使用Formatter的string(for obj: Any?) -> String?方法。 numberFormatter.string(for: value)!
  • @LeoDabus Every...single...time... 我忘记有string(for:) 并改用string(from:)。每次,我都会重新发现string(for:),每次我都会感到惊讶。谢谢。
  • 谢谢,很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2017-04-24
相关资源
最近更新 更多