Swift开发小技巧系列 - 浮点型数据的四舍五入

正文

在实际项目中,我们经常会遇到一些需要对浮点型数据进行四舍五入的情况。

举个例子,有这么需求:在UI上显示你每次跑步的距离,以米为单位,小数点后精确点两位,第三位四舍五入。

通常我们会这么实现:
版本一:

1
2
let distanceInM: Double = 1234.56789
let visibleDistanceInM: Double = (distanceInMeter * 100.0).rounded() / 100.0 // 1234.57

Swift原生类型Double和Float中就有一个rounded函数,该函数返回一个四舍五入后的值,这个值只精确到整数部分,即:(1234.56789).rounded() -> 1235.0。为了实现我们要求,我们做了一个简单的处理。

版本二:

1
2
3
4
5
6
extension Double {
public func roundTo(places: Int) -> Double {
let divisor = pow(10.0, Double(places))
return (self * divisor).rounded() / divisor
}
}
1
2
let distanceInM: Double = 1234.56789
let visibleDistanceInM: Double = distanceInM.roundTo(places: 2) // 1234.57

因为我们可能经常用到这个功能,每次都重复写这个逻辑显然不太好。这时候我给Double和Float写一个Extension来封装刚刚的逻辑,已达到复用的效果。

总结

  • 注意:我们调用Double或者Float的rounded()方法时,准确的讲是返回当前值最靠近的整数值,如果有两个同样靠近的值时选绝对值最大的那个整数值。比如:(5.2).rounded() -> 5.0, (5.5).rounded() -> 6.0, (-5.2).rounded() -> -5.0, (-5.5).rounded() -> -6.0。 苹果文档定义这种舍入方式叫做toNearestOrAwayFromZero,同时还有其它的舍人方式(toNearestOrEven, up, down, towardZero, awayFromZero),具体使用方法请参考文档。
  • 为了完整性,我们也需要给Float类型添加Extension实现刚刚的逻辑。具体详细的代码,请参考SwiftDevHints

联系方式

备注

我们在软件开发的过程中,为了提高效率,其中很重要的一环就是把反复使用到的功能或模块封装起来。因此我在GitHub上开源了一个小工具集 - SwiftDevHints,来总结自己在实际项目开发过程中封装的一些小功能。

刚刚介绍的只是其中一个小功能,想看看其它更多功能,请直接点击SwiftDevHints。如果您觉得对您有所帮助,请给一个star吧。