金融類app各種數(shù)值的精確計算問題

關于數(shù)值的計算就是按照字符串直接轉(zhuǎn)doubleValue的方式轉(zhuǎn)化為后進行加減乘除運算。這樣做在大多數(shù)情況下是不會有問題的掀序,但如果經(jīng)過全面測試的話八回,有些字符串轉(zhuǎn)double會出現(xiàn)精度損失問題岩遗,計算結(jié)果也會出現(xiàn)不準確的問題.

NSDecimalNumber是蘋果提供的專門金融貨幣精確數(shù)值計算的API萄焦。

+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode
                                               scale:(short)scale
                                    raiseOnExactness:(BOOL)raiseOnExactness
                                     raiseOnOverflow:(BOOL)raiseOnOverflow
                                    raiseOnUnderflow:(BOOL)raiseOnUnderflow
                                 raiseOnDivideByZero:(BOOL)raiseOnDivideByZero
參數(shù) 說明
roundingMode 要使用的舍入模式控轿,有四種值: NSRoundUp, NSRoundDown, NSRoundPlain, and NSRoundBankers
scale 結(jié)果保留幾位小數(shù)
raiseOnExactness 發(fā)生精確錯誤時是否拋出異常,一般為NO
raiseOnOverflow 發(fā)生溢出錯誤時是否拋出異常,一般為NO
raiseOnUnderflow 發(fā)生不足錯誤時是否拋出異常解幽,一般為NO
raiseOnDivideByZero 被0除時是否拋出異常,一般為YES

RoundingMode 舍入模式 官方注釋
// Rounding policies :
// Original
// value 1.2 1.21 1.25 1.35 1.27
// Plain 1.2 1.2 1.3 1.4 1.3
// Down 1.2 1.2 1.2 1.3 1.2
// Up 1.2 1.3 1.3 1.4 1.3
// Bankers 1.2 1.2 1.2 1.4 1.3

參數(shù) 說明
NSRoundPlain // Round up on a tie烘苹, 標準四舍五入模式
NSRoundDown // Always down == truncate 截斷所有超出部分
NSRoundUp // Always up躲株, 進一法
NSRoundBankers // on a tie round so last digit is even 特殊的四舍五入.最后一位是5的情況下,如果前一位是偶數(shù)則舍棄镣衡,前一位是奇數(shù)則進一位

NSDecimalNumber是進行數(shù)值計算的對象霜定,ji所有的加減乘除,冪運算操作對象廊鸥。

    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers
                                                                                             scale:2
                                                                                  raiseOnExactness:NO
                                                                                   raiseOnOverflow:NO
                                                                                  raiseOnUnderflow:NO
                                                                               raiseOnDivideByZero:YES];
    NSDecimalNumber *num1           = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@",@"2.37"]];
    NSDecimalNumber *num2           = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@",@"15.89"]];

    //加
    NSDecimalNumber *addResult      = [num1 decimalNumberByAdding:num2
                                                     withBehavior:handler];
    //減
    NSDecimalNumber *subtractResult = [num1 decimalNumberBySubtracting:num2
                                                          withBehavior:handler];
    //乘
    NSDecimalNumber *multiplyResult = [num1 decimalNumberByMultiplyingBy:num2
                                                            withBehavior:handler];
    //除
    NSDecimalNumber *divideResult   = [num1 decimalNumberByDividingBy:num2
                                                       withBehavior:handler];
    //平方
    NSDecimalNumber *powerResult    = [num1 decimalNumberByRaisingToPower:2
                                                          withBehavior:handler];
    NSLog(@"\n%f\n%f\n%f\n%f\n%f",[addResult doubleValue],[subtractResult doubleValue],[multiplyResult doubleValue],[divideResult doubleValue],[powerResult doubleValue]);

計算結(jié)果僅用于顯示作用望浩,計算必須使用原數(shù)值進行計算,結(jié)果使用公式轉(zhuǎn)換進行顯示惰说。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磨德,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吆视,更是在濱河造成了極大的恐慌典挑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件您觉,死亡現(xiàn)場離奇詭異,居然都是意外死亡授滓,警方通過查閱死者的電腦和手機琳水,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來般堆,“玉大人在孝,你說我怎么就攤上這事』此ぃ” “怎么了浑玛?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長噩咪。 經(jīng)常有香客問我顾彰,道長,這世上最難降的妖魔是什么胃碾? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任涨享,我火速辦了婚禮,結(jié)果婚禮上仆百,老公的妹妹穿的比我還像新娘厕隧。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布吁讨。 她就那樣靜靜地躺著髓迎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪建丧。 梳的紋絲不亂的頭發(fā)上排龄,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音翎朱,去河邊找鬼橄维。 笑死,一個胖子當著我的面吹牛拴曲,可吹牛的內(nèi)容都是我干的争舞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼澈灼,長吁一口氣:“原來是場噩夢啊……” “哼竞川!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叁熔,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤流译,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后者疤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體福澡,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年驹马,在試婚紗的時候發(fā)現(xiàn)自己被綠了革砸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡糯累,死狀恐怖算利,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泳姐,我是刑警寧澤效拭,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胖秒,受9級特大地震影響缎患,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阎肝,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一挤渔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧风题,春花似錦判导、人聲如沸嫉父。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绕辖。三九已至,卻和暖如春擂红,著一層夾襖步出監(jiān)牢的瞬間仪际,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工篮条, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吩抓。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓涉茧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疹娶。 傳聞我的和親對象是個殘疾皇子伴栓,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法雨饺,內(nèi)部類的語法钳垮,繼承相關的語法,異常的語法额港,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 1.現(xiàn)象: 因APP業(yè)務需要饺窿,從后臺端取得軌跡點的string,包含一千及以上個經(jīng)緯度坐標點移斩,數(shù)值精度為小數(shù)點后六...
    Masazumi柒閱讀 2,263評論 0 0
  • 前言 在日常的開發(fā)中我們隨時都會跟數(shù)字打著交道肚医,對數(shù)字的處理也是很平常的事,本文僅對常用的數(shù)字操作一個小結(jié)向瓷,當一個...
    進無盡閱讀 1,098評論 0 2
  • FreeMarker的模板文件并不比HTML頁面復雜多少,FreeMarker模板文件主要由如下4個部分組成: 1...
    年輕小伙程序員閱讀 2,997評論 0 5
  • 吃過晚餐猖任,繼續(xù)在家扔扔扔你稚。 我懷疑這是一種病態(tài),但感官上又的確什么都是多余朱躺。 人如果到了一種什么都不想要的境界刁赖,是...
    迷糊的謎閱讀 318評論 0 0