【问题标题】:How do you truncate unneeded floating point precision in Swift?如何在 Swift 中截断不需要的浮点精度?
【发布时间】:2020-11-21 20:18:46
【问题描述】:

我正在构建一个计算器应用程序。当我按下计算器上的% 按钮时,它会将当前值乘以 0.01。

如果我做52 * 0.01,我会得到0.52。但是如果我再按一下,它会计算0.52 * 0.01,我得到0.005200000000000001

此值会显示给应用程序的用户。如何截断多余的数字以以 0.0052 结尾,以便更有意义?

【问题讨论】:

  • 使用Decimal 而不是Double
  • 这就是解决方案,谢谢。

标签: ios swift


【解决方案1】:

答案是使用Decimal 而不是DoubleFloat

确保计算也在小数之间完成,这意味着您不应该尝试在两个双精度之间进行计算,并将结果转换为小数。

【讨论】:

  • 除了使用 Decimal 类型,您还需要确保只使用它的字符串初始化器。
【解决方案2】:
let formatterUpperBreakPoint = 999999999.9
let formatterLowerBreakPoint = 0.000000001
let maxInput = 9

let decimalFormatter = NumberFormatter()
decimalFormatter.numberStyle = .decimal
decimalFormatter.groupingSeparator = ","
decimalFormatter.maximumIntegerDigits = maxInput
decimalFormatter.maximumSignificantDigits = maxInput + 1

let number = 0.005200000000000001

if abs(number) < formatterUpperBreakPoint && abs(number) > formatterLowerBreakPoint {
    print(decimalFormatter.string(from: NSNumber(value: number)) ?? "0") // result 0.0052
}

【讨论】:

  • OP 不知道结果可能是多少个小数位
  • 我不建议在计算器应用中使用 double
  • @LeoDabus,我编辑了我之前的答案,感谢您的指导。
  • 无需实例化NSNumber 对象。可以使用Formatter的方法string(for: Any)
  • 顺便说一句 Decimal 将支持更广泛的精度。它使用 20 个字节而不是 8 个字节,并且不会遇到与 FloatingPoint 类型相同的问题。只要确保始终使用它的字符串初始化器。查看此帖子stackoverflow.com/a/55010456/2303865
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多