1.問題:
后臺傳的金額數(shù)是小數(shù)點(diǎn)后兩位的字符串芦缰,app端拿到數(shù)據(jù)之后要用到該金額做簡單算法(加減等),于是用doublevalue對字符串進(jìn)行處理堵漱,例如:“0.01”~0.0099999.....祷愉,后面將得到的浮點(diǎn)型(取小數(shù)點(diǎn)后兩位.2f)的數(shù)據(jù)轉(zhuǎn)化成字符串傳給后臺進(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í)都沒怎么注意。原理是這樣的扳还,從后臺接受返回的字符串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;
}