iOS 浮点数格式字符串比较大小 精度问题

计算机中float的存储是不精确的。但是真正开发实践的时候,或许只有出问题了,才会醒悟:哦,原来是这样。这个问题在高大上的OC上同样存在,稍不注意就会出现问题。尤其是涉及金融的计算比较数据方面显得格外重要。

iOS开发中,请求后台的接口,然后转化为模型对象,最终转化为NSString对象,然后控件显示出来。这一切都是那么的自然那么的熟悉。但是如果服务器返回的时浮点数格式的字符串 并且客户端还要用到这个数据去做加减乘除 比较大小这类操作,十有八九会出错,如果再涉及金钱利润的时候 这个责任就会无限放大。那么怎样解决呢?下面就看一个例子。


从服务端请求回的数据clearrate字符串类型 需要乘以100再去和另外一个字段exper比较大小 正常的做法是:

   CGFloat clearrate_float = [CUser.clearrate floatValue]*100.0;  

   CGFloat per_assurescale_value = [model.per_assurescale_value floatValue];

     if (clearrate_float > per_assurescale_value) {

        

    }

  这样看似没有问题,但是看一下真是数据就会发现有坑

  真是返回数据是这样的:

   {

    code = 0;

    data =     {

        clearrate = "1.05000000";

    };

   }

  但是实际调试数据是这样的:

     po clearrate_float

     104.99999523162842

  这样 返回的数据和自己转成浮点数在乘以100就会有误差! 那么接下来用到这个数据比较还是加减乘除都会出错!


*这事我们就要用到NSDecimalNumber这个类来处理浮点数的操作了

    //100.0转化成NSDecimalNumber

    NSDecimalNumber *decimalNumber_dit = [NSDecimalNumber decimalNumberWithFloat:100.0];

    //clearrate转化成NSDecimalNumber

    NSDecimalNumber *decimalNumber_clearrate = [NSDecimalNumber decimalNumberWithString:CUser.clearrate];

    

    //两个数想乘

    NSDecimalNumber *afterMultiplying_clearrate = [decimalNumber_clearrate decimalNumberByMultiplyingBy:decimalNumber_dit];


    //per_assurescale_value转化成NSDecimalNumber

    NSDecimalNumber *decimalNumber_per_assurescale_value = [NSDecimalNumber decimalNumberWithString:per_assurescale_value];


    //最终两个浮点数比较大小变成NSDecimalNumber比较大小(如果有需求还可以加减乘除四则运算)

    NSComparisonResult result_clearrate_float = [afterMultiplying_clearrate compare:decimalNumber_per_assurescale_value];


   //NSComparisonResult 的结果分为

     NSOrderedAscending  升序

     NSOrderedSame       相等

     NSOrderedDescending 降序

这样再看一下实际调试po出来的数据:

po decimalNumber_clearrate

1.05

po afterMultiplying_clearrate

105


这样对NSDecimalNumber对象进行对比 四则运算都不会出错了。大家要切记浮点数运算要特别小心!


大家有什么建议 和 学习心得可以留言啊 欢迎大家共同进步微笑



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值