支付金额精度问题

作者: AT19 | 来源:发表于2016-08-28 18:09 被阅读321次
    • 1.问题
      后台传的金额数是小数点后两位的字符串,app端拿到数据之后要用到该金额做简单算法(加减等),于是用doublevalue对字符串进行处理,例如:“0.01”~0.0099999.....,后面将得到的浮点型(取小数点后两位.2f)的数据转化成字符串传给后台进行调起三方的支付(支付金额0.01变成了0.00,app端展示是0.01,支付传给三方支付的金额为0.00,最后支付失败,因为不能传给三方金额为0的数据)

    • 2.处理方法
      网上查找方法-----
      (1)取小数点后3位进行判断,再四舍五入;
      (2)调用系统函数:

            NSDecimalNumber *decNumber(NSString *value1) {
                   return [NSDecimalNumber decimalNumberWithString:value1];
             }
      
      
    • 3.求助大神:以上方法均为达到预期效果,于是没辙了,最后求助基友,老大搞了一天........终于找到了解决方法,最后发现还是小细节。

    • 4.最终方案:其实真的很简单,平时都没怎么注意。原理是这样的,从后台接受返回的字符串NSString(例如:“0.01”),可是我们在做运算时,将NSString类型转double类型,强转肯定会掉精度的(0.009999998...),也就是上面的结果。所以呢,最后我们的做法是,将NSString ->double 用来做数据处理之后,再将double -> NSString ,不要取小数点后两位( [NSString stringWithFormat:@"%.2f" ,"0.01"]),而是 NSString *moneyStr = [NSString stringWithFormat:@"%lf" ,"0.01"];这个结果就是double类型的值转回来了,并且没有丢失精度。最后对这个字符串取小数点后两位。

    • 5.取小数点后两位金额的方法
      (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;    
      }   

    相关文章

      网友评论

        本文标题:支付金额精度问题

        本文链接:https://www.haomeiwen.com/subject/gwtxettx.html