目录
一,加减乘除
二,舍入
三,封装
在 深入浅出iOS浮点数精度问题 (上) 中,我们提到计算机内部是无法用浮点数精确表示一些大部分实数的,但在涉及到金额交易的业务场景中,我们真的对精度问题束手无策吗?
显然不是。
Foundation 框架中内置了高精度算法处理库 NSDecimalNumber.h 用于处理一切对精度有要求的需求。
下面演示一些基本的使用:
一,加减乘除
二,舍入
向上取整即为 ceil(value)
向下取整即为 floor(vlaue)
这两个可以很轻易的理解,但假如你对四舍五入六去偶这种舍入方式稍微感到有点摸不着头脑的话,请看下面几个例子。
三,封装
看完上面的高精度算法处理,你可能会想,精度的处理好是好,可这写起来未免太繁琐了吧!这么一大坨代码,就为了表达一个 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,如下代码所示:
然后实现它, 在 block 中打印一句话
在 main 函数里使用实例对象,便可以达到如下代码所示的调用效果
接下来我们实现链式的调用,这需要 block 对象返回调用者本身,如下代码所示
模仿上面过程,我们可以开始创作这个高精度算法链式调用的分类啦~~~
接口 :
实现 :
最终达到的调用效果如下所示: