2017-01-05 16:03:25 shan1991fei 阅读数 491
  double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
   float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
	float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;

  double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

2015-01-22 19:28:04 qq342261733 阅读数 3351

   

   当设计到金钱的计算.但是利用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];;

}

2015-11-24 16:00:50 lizitao 阅读数 9817

最近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

2019-04-03 16:31:14 xiaohuoziooo 阅读数 301

问题:

在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,返回比较结果;
2017-07-01 20:00:31 shihuboke 阅读数 453

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄


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


1、先看下问题:

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

[objc] view plain copy
  1. 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,代码如下:

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

3、参考资料:

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



谢谢!!!

ios 浮点数精度问题

阅读数 6626

没有更多推荐了,返回首页