iOS 之NSDecimalNumber的使用

NSDecimalNumber簡(jiǎn)介
蘋(píng)果針對(duì)浮點(diǎn)類型計(jì)算精度問(wèn)題提供出來(lái)的計(jì)算類投储,基于十進(jìn)制的科學(xué)計(jì)數(shù)法來(lái)計(jì)算玛歌,同時(shí)可以指定舍入模式昙读,一般用于貨幣計(jì)算。中國(guó)貨幣最小流通單位是分竭讳,也就是小數(shù)點(diǎn)后兩位创葡。
NSDecimalNumberHandler

/**
 初始化方法
 @param roundingMode 舍入方式
 @param scale 小數(shù)點(diǎn)后舍入值的位數(shù)
 @param exact 精度錯(cuò)誤處理
 @param overflow 溢出錯(cuò)誤處理
 @param underflow 下溢錯(cuò)誤處理
 @param divideByZero 除以0的錯(cuò)誤處理
 @return NSDecimalNumberHandler對(duì)象
 */
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero;

NSRoundingMode 的類型

typedef NS_ENUM(NSUInteger, NSRoundingMode) {
    NSRoundPlain,   // Round up on a tie
    NSRoundDown,    // Always down == truncate
    NSRoundUp,      // Always up
    NSRoundBankers  // on a tie round so last digit is even
};

NSRoundPlain 是四舍五入
NSRoundDown 是向下取整
NSRoundUp 是向上取整
NSRoundBankers 是在四舍五入的基礎(chǔ)上,加上末尾數(shù)為5時(shí)绢慢,變成偶數(shù)的規(guī)則

一:四舍五入

// 四舍五入
    NSDecimalNumberHandler *roundPlain = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
    {
        NSString *addStr = @"1.0";
        NSString *oneStr = @"1.114";
        NSString *twoStr = @"1.116";
        NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
        NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
        NSDecimalNumber *addNum = [NSDecimalNumber decimalNumberWithString:addStr];
        
        // 加法
        oneNum = [oneNum decimalNumberByAdding:addNum withBehavior:roundPlain];
        twoNum = [twoNum decimalNumberByAdding:addNum withBehavior:roundPlain];
        NSLog(@"\n1.114 + 1.0 (保留兩位小數(shù))四舍五入的結(jié)果為:%@\n1.116 + 1.0 (保留兩位小數(shù))四舍五入的結(jié)果為:%@", oneNum, twoNum);
    }
1.png

二:向下取整

    // 向下取整
    NSDecimalNumberHandler *roundDown = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
    {
        NSString *subtractStr = @"1.0";
        NSString *oneStr = @"1.114";
        NSString *twoStr = @"1.116";
        NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
        NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
        NSDecimalNumber *subtractNum = [NSDecimalNumber decimalNumberWithString:subtractStr];
        
        // 減法
        oneNum = [oneNum decimalNumberBySubtracting:subtractNum withBehavior:roundDown];
        twoNum = [twoNum decimalNumberBySubtracting:subtractNum withBehavior:roundDown];
        NSLog(@"\n1.114 - 1.0 (保留兩位小數(shù))向下取整的結(jié)果為:%@\n1.116 - 1.0 (保留兩位小數(shù))向下取整的結(jié)果為:%@", oneNum, twoNum);
    }
2.png

三:向上取整

    // 向上取整
    NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundUp scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
    {
        NSString *multiplyStr = @"1.0";
        NSString *oneStr = @"1.114";
        NSString *twoStr = @"1.116";
        NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
        NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
        NSDecimalNumber *multiplyNum = [NSDecimalNumber decimalNumberWithString:multiplyStr];
        
        // 乘法
        oneNum = [oneNum decimalNumberByMultiplyingBy:multiplyNum withBehavior:roundUp];
        twoNum = [twoNum decimalNumberByMultiplyingBy:multiplyNum withBehavior:roundUp];
        NSLog(@"\n1.114 * 1.0 (保留兩位小數(shù))向上取整的結(jié)果為:%@\n1.116 * 1.0 (保留兩位小數(shù))向上取整的結(jié)果為:%@", oneNum, twoNum);
    }
3.png

四:NSRoundBankers

    // 在四舍五入的基礎(chǔ)上灿渴,加上末尾數(shù)為5時(shí)洛波,變成偶數(shù)的規(guī)則,例如小數(shù)點(diǎn)后兩位骚露, 1.215 時(shí)變?yōu)?1.22, 1.225 時(shí)變?yōu)?1.22
    NSDecimalNumberHandler *roundBankers = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
    {
        NSString *dividStr = @"1.0";
        NSString *oneStr = @"1.115";
        NSString *twoStr = @"1.125";
        NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
        NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
        NSDecimalNumber *dividNum = [NSDecimalNumber decimalNumberWithString:dividStr];
        
        // 除法
        oneNum = [oneNum decimalNumberByDividingBy:dividNum withBehavior:roundBankers];
        twoNum = [twoNum decimalNumberByDividingBy:dividNum withBehavior:roundBankers];
        NSLog(@"\n1.115 / 1.0 (保留兩位小數(shù))NSRoundBankers的結(jié)果為:%@\n1.125 / 1.0 (保留兩位小數(shù))NSRoundBankers的結(jié)果為:%@", oneNum, twoNum);
    }
4.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹬挤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棘幸,更是在濱河造成了極大的恐慌焰扳,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误续,死亡現(xiàn)場(chǎng)離奇詭異吨悍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蹋嵌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)育瓜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人栽烂,你說(shuō)我怎么就攤上這事躏仇。” “怎么了腺办?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵焰手,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我菇晃,道長(zhǎng),這世上最難降的妖魔是什么蚓挤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任磺送,我火速辦了婚禮,結(jié)果婚禮上灿意,老公的妹妹穿的比我還像新娘估灿。我一直安慰自己,他們只是感情好缤剧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布馅袁。 她就那樣靜靜地躺著,像睡著了一般荒辕。 火紅的嫁衣襯著肌膚如雪汗销。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天抵窒,我揣著相機(jī)與錄音弛针,去河邊找鬼。 笑死李皇,一個(gè)胖子當(dāng)著我的面吹牛削茁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茧跋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼慰丛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瘾杭,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诅病,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后富寿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體睬隶,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年页徐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苏潜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡变勇,死狀恐怖恤左,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搀绣,我是刑警寧澤飞袋,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站链患,受9級(jí)特大地震影響巧鸭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麻捻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一纲仍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贸毕,春花似錦郑叠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至摊腋,卻和暖如春沸版,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兴蒸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工推穷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人类咧。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓馒铃,卻偏偏與公主長(zhǎng)得像蟹腾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子区宇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • iOS開(kāi)發(fā)中娃殖,接受后臺(tái)的響應(yīng),把json然后轉(zhuǎn)化為模型對(duì)象议谷,最終轉(zhuǎn)化為NSString對(duì)象炉爆。 后臺(tái)返回的一個(gè)數(shù)字(...
    海邊漫步的我閱讀 1,896評(píng)論 0 4
  • 在開(kāi)發(fā)中經(jīng)常遇到float類型數(shù)據(jù)轉(zhuǎn)化為NSString再進(jìn)行顯示,但是經(jīng)常遇到精度出錯(cuò)的問(wèn)題卧晓,如下代碼: 按照一...
    口子窖閱讀 833評(píng)論 0 0
  • 爸爸媽媽旅行回家芬首,跟我煲了一個(gè)小時(shí)電話粥。媽媽滔滔不絕地講著歐洲旅行的見(jiàn)聞逼裆,還很興奮郁稍,一點(diǎn)沒(méi)有時(shí)差。 這次他們?nèi)シ?..
    花間星事閱讀 562評(píng)論 7 30
  • 非暴力溝通表達(dá)感激的方式非暴力溝通表達(dá)感激的方式包含三個(gè)部分:(1)對(duì)方做了什么事情使我們的生活得到了改善胜宇;(2)...
    Fly_Catkin閱讀 264評(píng)論 0 0
  • 微信已經(jīng)不僅僅是一款社交軟件了耀怜,還是一種人品檢測(cè)儀,你在微信的一言一行都暴露了你的修養(yǎng)桐愉。 01. 幾個(gè)朋友閑聊财破。 ...
    畫(huà)不圓的圓閱讀 326評(píng)論 0 0