美文网首页iOS程序员码农的世界
Swift开发小技巧系列 - 浮点型数据的四舍五入

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

作者: DEREK_ZHOU | 来源:发表于2017-09-15 16:51 被阅读233次

    原文链接

    正文

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

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

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

    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。为了实现我们要求,我们做了一个简单的处理。

    版本二:

    extension Double {
        public func roundTo(places: Int) -> Double {
            let divisor = pow(10.0, Double(places))
            return (self * divisor).rounded() / divisor
        }
    }
    
    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吧。

    相关文章

      网友评论

        本文标题:Swift开发小技巧系列 - 浮点型数据的四舍五入

        本文链接:https://www.haomeiwen.com/subject/irfesxtx.html