美文网首页知识点啊 有木有iOS资料库iOS
深入浅出iOS浮点数精度问题 (下)

深入浅出iOS浮点数精度问题 (下)

作者: 杨小黑 | 来源:发表于2017-09-06 17:04 被阅读77次

    目录

    一,加减乘除

    二,舍入

    三,封装


    在 深入浅出iOS浮点数精度问题 (上) 中,我们提到计算机内部是无法用浮点数精确表示一些大部分实数的,但在涉及到金额交易的业务场景中,我们真的对精度问题束手无策吗?

    显然不是。

    Foundation 框架中内置了高精度算法处理库 NSDecimalNumber.h 用于处理一切对精度有要求的需求。

    下面演示一些基本的使用:

    一,加减乘除

    演示1.png

    二,舍入

    演示2.png

    向上取整即为 ceil(value)

    向下取整即为 floor(vlaue)

    这两个可以很轻易的理解,但假如你对四舍五入六去偶这种舍入方式稍微感到有点摸不着头脑的话,请看下面几个例子。

    四舍五入 & 四舍六入五去偶.png

    三,封装

    看完上面的高精度算法处理,你可能会想,精度的处理好是好,可这写起来未免太繁琐了吧!这么一大坨代码,就为了表达一个 1 + 2 ???你是希尔瑞斯吗??再加上这冗长的取名方式 decimalNumberByMultiplyingBy: 简直是醉了.....

    好,下面我们来封装一下内置的高精度算法库,让调用更加轻松简单

    想达到的最终调用效果是能够直接使用 NSString 字面量搭配点语法就能调用一个四则运算或者指定小数点后几位的舍入,写起来就像 Java 中对大数处理的感觉,类似这种

    1 + 3 - 4 + 9 - 123
    @"1".add(@"3").sub(@"4").add(@"9").sub(@"123")

    1.1239123987324 > 1.123999999999
    @"1.1239123987324".g(@"1.123999999999")

    999 <= 1000
    @"999".le(@"1000")

    将1.3674 四舍五入到小数点后两位
    @"1.3674".roundToPlain(2)

    将1.3674 四舍六入五去偶到小数点后四位
    @"1.3674".roundToBankers(4)

    将1.3674 向上舍入到小数点后三位
    @"1.3674".roundToUp(3)

    将1.3674 向下舍入到小数点后一位
    @"1.3674".roundToDown(1)

    要达到这样的效果,需要使用链式编程的一些技巧。我们知道,在 Objective-C 中,Block 也是一种对象,它可以通过 block(param1, param2,...) 的方式进行调用,那么我们可以提供一个方法,它的返回值是一个block,如下代码所示:

    链式调用第一步.h

    然后实现它, 在 block 中打印一句话


    链式调用第一步.m

    在 main 函数里使用实例对象,便可以达到如下代码所示的调用效果


    链式调用测试用例

    接下来我们实现链式的调用,这需要 block 对象返回调用者本身,如下代码所示


    链式调用第二步.h .m

    模仿上面过程,我们可以开始创作这个高精度算法链式调用的分类啦~~~

    接口 :

    123123123123.png

    实现 :

    66666666.png

    最终达到的调用效果如下所示:

    链式调用封装高精度算法

    相关文章

      网友评论

        本文标题:深入浅出iOS浮点数精度问题 (下)

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