double 精度ios_ios 字符串转double精度问题 - CSDN
精华内容
参与话题
  • iOS 解决相关的精度问题

    千次阅读 2016-07-29 11:13:40
    虽说这个问题不难,但是,解决起来十分的麻烦,其中就有一些相关的精度问题: 下面我就介绍一下我们遇到的问题 通过网络请求 直接得到一些数据Data ,通过iOS 系统自带的解析方式: NSDictionary *dic = ...

    最近在项目中遇到一些问题;虽说这个问题不难,但是,解决起来十分的麻烦,其中就有一些相关的精度问题:

    下面我就介绍一下我们遇到的问题


    通过网络请求 直接得到一些数据Data ,通过iOS 系统自带的解析方式:

    NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:responseObject options:NSJSONReadingMutableContainers |NSJSONReadingMutableLeaves error:nil];

    把data 转换成dic 

    我通过断点的方式,可以查看所有的数据

    总共20条,下面我们查看第三条,然后查看如图这个字节


    我们把 这个字节打印出来(选中那个字节,右击一下,选择 printf Description of "value" 这一选项),这时候可以在控制台看到打印出来的结果

    Printing description of ((__NSCFNumber *)0x00007fe4850b46a0):

    9.369999999999999


    上面看的结果是 (doule)9.37 为什么打印的结果会不同呢,精度的缺失呀

    此上为其一


    下面还有一种情况 就是:

    NSArray *list = [resultobjectForKey:@"list"];

            for (NSDictionary * dicin list) {

                double testDouble = [dic[@"annualEarnings"]doubleValue]; 

                NSLog(@"%lf", [dic[@"annualEarnings"]doubleValue]);

            }


    通过这种方法遍历,打印的结果如下:

     跟上面图一的结果一样,但是当我

            NSLog(@"%@",result);


    打印整个字典的时候,看图:


    为什么会出现上述的如此情况,问题的出现在所难免,其中一部分是iOS 系统编译器的问题,那么,作为一个程序员,能做的就是去解决这类问题(因为编译器的问题你也解决不了),遇到问题要想办法去解决

    下面是我在项目中运用的方法去解决这个问题

    首先 我定义了一个方法:

    /*

     此方法把double ---> NSString

     

     */

    - (NSString *)decimalNumberWithDouble:(double)conversionValue

    {

       NSString *doubleString        = [NSStringstringWithFormat:@"%lf", conversionValue];

       NSDecimalNumber *decNumber    = [NSDecimalNumberdecimalNumberWithString:doubleString];

       return [decNumber stringValue];

    }



    然后我们可以在遍历字典

    NSArray *list = [resultobjectForKey:@"list"];

            for (NSDictionary * dicin list) {

            

               double testDouble = [dic[@"annualEarnings"]doubleValue]; 

               NSString *convertString = [selfdecimalNumberWithDouble:testDouble];

                NSLog(@"%@",convertString);

            }

    j结果如图

    看见了了没  精度没有缺失

    所以,遇到问题要解决:


    再如:

     NSString *convertString = [self decimalNumberWithDouble:9.3699999999];

        NSLog(@"%@",convertString);//9.37 方法在上面


     NSString *doubleString        = [NSString stringWithFormat:@"%lf", 9.3699999999];

        NSLog(@"%@",doubleString);//9.370000


      NSString *doubleString        = [NSString stringWithFormat:@"%lf", 9.3688889999];

        NSLog(@"%@",doubleString);//9.368889


    上面都是一些精度相关的问题

    附录:下面这个方法是字符串转化成double类型 解决精度问题

    /*

     *字符串转化成double类型

     */

    - (double)StringChangeToDoubleForJingdu:(NSString *)textString

    {

       if (textString == nil || [textString isEqualToString:@""]) {

           return 0.0;

        }

        NSNumberFormatter *formatter = [[NSNumberFormatteralloc]init];

        

        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

        

       return  [[formatter numberFromString:textString]doubleValue];

     

    }


    展开全文
  • 最近app报了一个double类型显示的bug 1、先看下问题: 代码里面接受来自api返回的double型的数据,方式如下: itemCell.priceLabel.text = [NSString stringWithFormat:@"¥%@", @(item.ticketGroup.bestPrice)]; ...

    最近app报了一个double类型显示的bug

    1、先看下问题:

    代码里面接受来自api返回的double型的数据,方式如下:

    itemCell.priceLabel.text = [NSString stringWithFormat:@"¥%@", @(item.ticketGroup.bestPrice)];

    结果api传过来89.9时,label显示结果如下:

    2、%f,%e,%g的区别:

    %@,不做类型转换,数据原来是什么类型,它就会原封不动的将它包装成对象。那么我们来看看,这是什么原因导致了,这种bug。


    看到上面的对比,你就该知道,%f遇到有些double数据会“失真”,此时不能再用%f处理了。%e是指数形式,%g是选用%f%e中较短的一种形式输出。所以,此时建议采取

    %g,代码如下:

    itemCell.priceLabel.text = [NSString stringWithFormat:@"¥%g", item.ticketGroup.bestPrice];

    3、参考资料:

    http://www.bkjia.com/IOSjc/872298.html

    展开全文
  • iOS double类型精度问题以及计算问题

    千次阅读 2015-01-23 20:13:41
    当设计到金钱的计算....1:控制double类型的精度  double abc = 0.1 - 0.01 - 0.00001009;  NSNumberFormatter *nf = [[NSNumberFormatteralloc ]init];  [nf setMaximumIntegerDigits:8];  NSNu

       

       当设计到金钱的计算.但是利用double类型数据会不稳定.

    1:控制double类型的精度

        double abc = 0.1 - 0.01 - 0.00001009;

        NSNumberFormatter *nf = [[NSNumberFormatteralloc ]init];

        [nf setMaximumIntegerDigits:8];

        NSNumber *number = [nfnumberFromString:[NSString stringWithFormat:@"%.8lf",abc]];

        NSLog(@"number is ---%lf",[numberdoubleValue]);


    2:对于double类型不损失精度的计算方法

    -(CGFloat)addreeBackMoneyWithAmount:(CGFloat)amount ToMoney:(CGFloat)toMoney

    {

        NSString *amountStr = [NSString stringWithFormat:@"%.08lf",amount];

        NSString *toMoneyStr = [NSString stringWithFormat:@"%.08lf",toMoney];

        

        NSDecimalNumber *amountNum = [NSDecimalNumber decimalNumberWithString:amountStr];

        NSDecimalNumber *toMoneyNum = [NSDecimalNumber decimalNumberWithString:toMoneyStr];

        double xiaofee = 0.001210000;

        NSDecimalNumber *feeNum = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.8lf",xiaofee]];

        NSDecimalNumber *resultNum = [amountNum decimalNumberBySubtracting:toMoneyNum];

        NSDecimalNumber *subTracFeeNum = [resultNum decimalNumberBySubtracting:feeNum];

        

        return [subTracFeeNum doubleValue];;

    }

    展开全文
  • iOS开发中,我们会经常碰到使用浮点型接收后台返回的数据,这个时候往往就会遇到精度转换问题,尤其是在开发金融类APP的时候: 解决: 使用 NSDecimalNumber 将float/double数据转化成NSDecimalNumber 类型的对象...

    问题:

    在iOS开发中,我们会经常碰到使用浮点型接收后台返回的数据,这个时候往往就会遇到精度转换问题,尤其是在开发金融类APP的时候:

    解决:

    使用 NSDecimalNumber 将float/double数据转化成NSDecimalNumber 类型的对象进行 +、-、*、/ 运算。

     -(double)decimalNumber:(double)num1 num2:(double)num2  {
      
        NSDecimalNumber *deciNum1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",num1]];
        
        NSDecimalNumber *deciNum2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",num2]];
        
        NSDecimalNumber *deciNum3 = [deciNum1 decimalNumberBySubtracting:deciNum2];
        
        return deciNum3.doubleValue;
    }
    // 调用:
    double result = [self  decimalNumber: 2.01 num2: 2]; // 结果为 0.01
    

    有关NSDecimalNumber的运算

     - decimalNumberBySubtracting: n1 - n2,返回 n1 - n2 的结果值
     - decimalNumberByMultiplyingBy:n1 * n2,
     - decimalNumberByDividingBy:n1 / n2,
     - decimalNumberByAdding:n1 + n2,
     - compare:比较 n1 和 n2,返回比较结果;
    
    展开全文
  • 最近app报了一个double类型显示的bug 1、先看下问题: 代码里面接受来自api返回的double型的数据,方式如下: [objc] view plain copy itemCell.priceLabel.text = [NSSt
  • 前几天在IOS开发时发现一个JSON解析奇葩问题,会出现一定概率的错误,如下://出现BUG的条件必须是两位数,且带两位小数,类型还必须是float //两位数:十位必须是7、8、9;个位数随意 //两位小数:个位数随意;十...
  • C++读二进制文件 及 C++设置double精度

    千次阅读 2017-04-20 13:04:29
    C++设置double精度#include cout setiosflags(ios::fixed) setprecision(2) m "%" endl;******************************************************************************************************************...
  • 深入浅出iOS浮点数精度问题 (下)

    千次阅读 2017-09-06 20:11:39
    我们提到计算机内部是无法用浮点数精确表示一些大部分实数的,但在涉及到金额交易的业务场景中,我们真的对精度问题束手无策吗?显然不是。Foundation 框架中内置了高精度算法处理库 NSDecimalNumber.h 用于处理一切...
  • iOSdouble内容的处理

    2018-05-17 16:29:49
    if ([obj isKindOfClass:[NSNumber class]]) { // 防止 double 类型精度丢失,不用 -[NSNumber stringValue] 方法 static NSNumberFormatter *numberFormatter; if (!numberFormatter) { numberF...
  • ios 浮点数精度问题

    千次阅读 2016-03-31 15:11:09
    之前一直在写Java,涉及到精度问题,一般用java的BigDecimal就能解决,最近遇到ios项目中一些精度问题,我们平时用的最多的应该是float,double之类的,当然ios还有一个类CGFloat,这个类包含了float和double,然后...
  • iOS 中经常会计算金额和价格,我们有时会定义数据类型为 double 或者 float,这样在做过一些运算后会发现精度丢失了,这显然不是我们想要的结果。今日偶然间看到一篇技术博文,为了记忆,顺道解决我的这个问题,...
  • 1、问题描述:服务器返回的double类型9.9、4.94的数字时 2、之前处理方式是 :(从内存、cpu计算来说double都是比较合适的,一般情况下都用double) goodsPrice.floatValue = 9.89999961 ==> 保留2位小数点...
  • 服务端给客户端返回数据一般使用 JSON 字符串,iOS 端一般会将 JSON 转成 Dictionary 使用。 这是一个简单的 JSON 串: {"progress":64.4} 值得注意的是 JSON 串被转换成 Dictionary 后会将基本数值类型转换成_...
  • 调试变量观察14.5*0.01 double型的值为0.149999999999999999999999,但是如果直接出入保存到double型中是都不会有精度损失,只要一和double运算则0.145都会自动变为0.149999999999999,请问这种问题该如何解决?...
  • double转long丢失精度

    2020-02-18 17:04:37
    项目中的一个bug: double a = 129.97; System.out.println((long)(a*100)); double b =129.98;...System.out.println((long)(b*100));...2个值一样,查了一下资料,原因是double精度问题,129.98d实际的值是...
  • iOS - Json解析数据精度丢失处理

    千次阅读 2016-10-09 18:10:04
    开发中处理处理数字、价格金额等问题时, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题,因此使用系统自带的NSDecimalNumber做处理, 能解决这问题: 经过测试其实系统NSDecimalNumber是对有问题值做了...
  • float和double精度问题

    2017-01-05 16:03:25
    double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双...
  • iOS 解决字符串floatValue,doubleValue等后计算不精确问题,一句话解决精确计算,精确比较
  • 如图,网络请求返回的浮点数精度丢失,直接展示肯定是有问题的。 使用时保留两位小数并去掉末尾的0 + (NSString *)dealwithJDDSWithFloat:(float)number { NSString *jqStr = [NSString stringWithFormat:@"%.2f...
  • double和long long 的精度对比

    千次阅读 2016-04-06 09:32:13
    指数运算 时间限制:600 ms | 内存限制:65535 KB 难度:2 描述写一个程序实现指数运算 X^N。(1 输入输入包含多行数据  每行数据是两个整数X N 数据以EOF结束 输出于输入的每一行输出X^N的值 ...看起来
1 2 3 4 5 ... 20
收藏数 6,774
精华内容 2,709
关键字:

double 精度ios