最近在做一個(gè)分期支付的功能, 跟錢有關(guān), 所以需要計(jì)算的特別精確, 不能有一分一厘的差距,? 而且計(jì)算的中間還有一個(gè)需要向下取整 ,? 剛開始各種用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)后保留幾位, 及保留的時(shí)候是四舍五入保留還是向上或向下取整保留:
NSDecimalNumberHandler? 這個(gè)是控制如何取整及小數(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;