1.問題:
后臺(tái)傳的金額數(shù)是小數(shù)點(diǎn)后兩位的字符串,app端拿到數(shù)據(jù)之后要用到該金額做簡單算法(加減等),于是用doublevalue對字符串進(jìn)行處理,例如:“0.01”~0.0099999.....,后面將得到的浮點(diǎn)型(取小數(shù)點(diǎn)后兩位.2f)的數(shù)據(jù)轉(zhuǎn)化成字符串傳給后臺(tái)進(jìn)行調(diào)起三方的支付(支付金額0.01變成了0.00,app端展示是0.01,支付傳給三方支付的金額為0.00,最后支付失敗,因?yàn)椴荒軅鹘o三方金額為0的數(shù)據(jù))-
2.處理方法:
網(wǎng)上查找方法-----
(1)取小數(shù)點(diǎn)后3位進(jìn)行判斷,再四舍五入;
(2)調(diào)用系統(tǒng)函數(shù):NSDecimalNumber *decNumber(NSString *value1) { return [NSDecimalNumber decimalNumberWithString:value1]; } 3.求助大神:以上方法均為達(dá)到預(yù)期效果,于是沒轍了,最后求助基友,老大搞了一天........終于找到了解決方法,最后發(fā)現(xiàn)還是小細(xì)節(jié)。
4.最終方案:其實(shí)真的很簡單,平時(shí)都沒怎么注意。原理是這樣的,從后臺(tái)接受返回的字符串NSString(例如:“0.01”),可是我們在做運(yùn)算時(shí),將NSString類型轉(zhuǎn)double類型,強(qiáng)轉(zhuǎn)肯定會(huì)掉精度的(0.009999998...),也就是上面的結(jié)果。所以呢,最后我們的做法是,將NSString ->double 用來做數(shù)據(jù)處理之后,再將double -> NSString ,不要取小數(shù)點(diǎn)后兩位( [NSString stringWithFormat:@"%.2f" ,"0.01"]),而是 NSString *moneyStr = [NSString stringWithFormat:@"%lf" ,"0.01"];這個(gè)結(jié)果就是double類型的值轉(zhuǎn)回來了,并且沒有丟失精度。最后對這個(gè)字符串取小數(shù)點(diǎn)后兩位。
5.取小數(shù)點(diǎn)后兩位金額的方法:
(1)方法:
-(NSString *)getStringFromDouble:(double)needToPayMoney {
NSString *moneyStr = [NSString stringWithFormat:@"%lf",needToPayMoney];
NSRange range = [moneyStr rangeOfString:@"."];
NSUInteger location = range.location;
NSString *needToPayFact = [moneyStr substringToIndex:location + 3];
return needToPayFact;
}