精確計(jì)算 NSDecimalNumber 的使用

最近在做一個分期支付的功能, 跟錢有關(guān), 所以需要計(jì)算的特別精確, 不能有一分一厘的差距,? 而且計(jì)算的中間還有一個需要向下取整 ,? 剛開始各種用float , double, int 等等? 計(jì)算都不行, 總是出現(xiàn)小數(shù)點(diǎn)后計(jì)算不精確的問題.? 最后仿照java里 bigDecimal計(jì)算, 猜想oc應(yīng)該也有decimal計(jì)算方法, 上網(wǎng)一搜, 還真有.

經(jīng)過N多次試驗(yàn)發(fā)現(xiàn),? %.2f? 并不是直接截取小數(shù)點(diǎn)后2位, 而是四舍五入后的保留兩位

以下是代碼, 精確計(jì)算, 包括小數(shù)點(diǎn)后保留幾位, 及保留的時候是四舍五入保留還是向上或向下取整保留:

NSDecimalNumberHandler? 這個是控制如何取整及小數(shù)點(diǎn)后保留幾位,? NSRoundDown / NSRoundUp/NSRoundPlain? 向下/向上/四舍五入取整

NSDecimalNumberHandler *roundDown = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];

// 首付款, 不含最后一期的分期本金

NSDecimalNumber *pp = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f", ppMoney]];

NSDecimalNumber *downPay = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f", rateDownPayment]];

NSDecimalNumber *shoufukuan = [pp decimalNumberByMultiplyingBy:downPay];

// 總的分期本金

NSDecimalNumber *zongFenQiBenJin = [pp decimalNumberBySubtracting:shoufukuan];

// 每期的分期本金? = 總的分期本金 / 期數(shù)? (小數(shù)點(diǎn)后兩位向下取整)

NSDecimalNumber *qishu = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f", installmentNum]];

NSDecimalNumber *meiQiFenQiBenJin = [[zongFenQiBenJin decimalNumberByDividingBy:qishu] decimalNumberByRoundingAccordingToBehavior:roundDown];

double meiqifenqibenjin = meiQiFenQiBenJin.doubleValue;

// 總的利息 = 總的分期本金 * 費(fèi)率

// 每期的利息 =? 總的利息 / 期數(shù)? ? ? (小數(shù)點(diǎn)后兩位向下取整)

NSDecimalNumber *rate = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f", rateLoan]];

NSDecimalNumber *cheng = [zongFenQiBenJin decimalNumberByMultiplyingBy:rate];

NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f", installmentNum]];

NSDecimalNumber *mq = [cheng decimalNumberByDividingBy:num];

NSDecimalNumber *meiQi = [mq decimalNumberByRoundingAccordingToBehavior:roundDown];

double meiqilixi = meiQi.doubleValue;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容