目錄
一糕篇,加減乘除
二绳矩,舍入
三平项,封裝
在 深入淺出iOS浮點(diǎn)數(shù)精度問(wèn)題 (上) 中,我們提到計(jì)算機(jī)內(nèi)部是無(wú)法用浮點(diǎn)數(shù)精確表示一些大部分實(shí)數(shù)的羊娃,但在涉及到金額交易的業(yè)務(wù)場(chǎng)景中唐全,我們真的對(duì)精度問(wèn)題束手無(wú)策嗎?
顯然不是迁沫。
Foundation 框架中內(nèi)置了高精度算法處理庫(kù) NSDecimalNumber.h 用于處理一切對(duì)精度有要求的需求芦瘾。
下面演示一些基本的使用:
一,加減乘除
二集畅,舍入
向上取整即為 ceil(value)
向下取整即為 floor(vlaue)
這兩個(gè)可以很輕易的理解近弟,但假如你對(duì)四舍五入六去偶這種舍入方式稍微感到有點(diǎn)摸不著頭腦的話(huà),請(qǐng)看下面幾個(gè)例子挺智。
三祷愉,封裝
看完上面的高精度算法處理,你可能會(huì)想赦颇,精度的處理好是好二鳄,可這寫(xiě)起來(lái)未免太繁瑣了吧!這么一大坨代碼媒怯,就為了表達(dá)一個(gè) 1 + 2 订讼??扇苞?你是希爾瑞斯嗎欺殿??再加上這冗長(zhǎng)的取名方式 decimalNumberByMultiplyingBy: 簡(jiǎn)直是醉了.....
好鳖敷,下面我們來(lái)封裝一下內(nèi)置的高精度算法庫(kù)脖苏,讓調(diào)用更加輕松簡(jiǎn)單
想達(dá)到的最終調(diào)用效果是能夠直接使用 NSString 字面量搭配點(diǎn)語(yǔ)法就能調(diào)用一個(gè)四則運(yùn)算或者指定小數(shù)點(diǎn)后幾位的舍入,寫(xiě)起來(lái)就像 Java 中對(duì)大數(shù)處理的感覺(jué)定踱,類(lèi)似這種
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 四舍五入到小數(shù)點(diǎn)后兩位
@"1.3674".roundToPlain(2)
將1.3674 四舍六入五去偶到小數(shù)點(diǎn)后四位
@"1.3674".roundToBankers(4)
將1.3674 向上舍入到小數(shù)點(diǎn)后三位
@"1.3674".roundToUp(3)
將1.3674 向下舍入到小數(shù)點(diǎn)后一位
@"1.3674".roundToDown(1)
要達(dá)到這樣的效果棍潘,需要使用鏈?zhǔn)骄幊痰囊恍┘记伞N覀冎溃?Objective-C 中亦歉,Block 也是一種對(duì)象恤浪,它可以通過(guò) block(param1, param2,...) 的方式進(jìn)行調(diào)用,那么我們可以提供一個(gè)方法鳍徽,它的返回值是一個(gè)block资锰,如下代碼所示:
然后實(shí)現(xiàn)它, 在 block 中打印一句話(huà)
在 main 函數(shù)里使用實(shí)例對(duì)象敢课,便可以達(dá)到如下代碼所示的調(diào)用效果
接下來(lái)我們實(shí)現(xiàn)鏈?zhǔn)降恼{(diào)用阶祭,這需要 block 對(duì)象返回調(diào)用者本身,如下代碼所示
模仿上面過(guò)程直秆,我們可以開(kāi)始創(chuàng)作這個(gè)高精度算法鏈?zhǔn)秸{(diào)用的分類(lèi)啦~~~
接口 :
實(shí)現(xiàn) :
最終達(dá)到的調(diào)用效果如下所示: