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

目录

一,加减乘除
二,舍入
三,封装

在 深入浅出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

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

链式调用封装高精度算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值