支付金額精度問題

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

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

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