支付金额精度问题

  • 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;    
  }   

你可能感兴趣的:(支付金额精度问题)