支付金额精度问题

作者: 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;    
  }   

相关文章

  • 支付金额精度问题

    1.问题:后台传的金额数是小数点后两位的字符串,app端拿到数据之后要用到该金额做简单算法(加减等),于是用dou...

  • 金额相关精度问题

    最近项目中遇到金额计算,CGFloat类型金额计算的过程中,让我吃了不少苦头,先来看下面几行代码: 示例代码 略去...

  • 系统中,金额存储方式到底是用int还是用BigDecimal

    问题描述 系统设计中,经常会碰到金额的相关问题,金额计算、换算等等,而其中最重要的一点就是精度问题。如何处理好精度...

  • 项目中支付时遇到的精度问题(NSDecimalNumber)

    支付中最怕遇到精度有关的问题,导致金额计算不准确,我们手机端从后台接口获取数据的时候,有时候就会出现这样的问题,所...

  • iOS-Float大小比较

    在价格,金额的计算中,如果直接使用<, >, =去计算金额会导致由精度导致的不准确问题。好的做法是:

  • js 浮点数计算

    在做项目的时候,涉及到金额加减时,经常会出现计算精度的问题,常见例子如下: 在遇到浮点数运算后出现的精度问题时,起...

  • iOS - Json解析精度丢失处理(NSString, Dou

    开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使...

  • 精度丢失

    开发中处理处理价格金额问题, 后台经常返回float、double类型, 打印或转成NSString都会有精度丢失...

  • js数字金额大写转换

    js数字金额大写转换,传入值number类型或string类型 移位的优化,防止出现精度不准的问题 输出结果

  • Bill

    1.支付宝账单 月份 -----金额---月度金额 支付宝结算: 31551 2.微信账单 月份-----金额-...

网友评论

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

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