、问题描述:服务器返回的double类型9.、.94的数字时

、之前处理方式是 :(从内存、cpu计算来说double都是比较合适的,一般情况下都用double)
goodsPrice.floatValue = 9.89999961 ==> 保留2位小数点9. 、现在的解决方法是:
goodsPrice.doubleValue = 9.9000000000000003 ==> 保留2位小数点9. 、其他的解决方法:
服务器返回的数据全部设置为String类型,就不会出现这样的问题 从内存、cpu计算来说float都是比较合适的,一般情况下都用float
double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。

解决方式之一:

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

:控制double类型的精度

    double abc = 0.1 - 0.01 - 0.00001009;

    NSNumberFormatter *nf = [[NSNumberFormatteralloc ]init];

    [nf setMaximumIntegerDigits:];

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

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

:对于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];;

}

举个栗子: 计算0.1*999999 看看会有什么结果?

- (void)testDecimalNumber {
double d1 = 0.01;
double d2 = ;
double d3 = d1 * d2;
NSLog(@"%@",n3);
}

和我们想到的结果:9999.99不同

遇到这种问题解决办法如下:

- (void)testDecimalNumber {

     NSDecimalNumber* n1 = [NSDecimalNumber       decimalNumberWithString:[NSString    stringWithFormat:@"%f",d1]];

    NSDecimalNumber* n2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",d2]];

    NSDecimalNumber* n3 = [n1 decimalNumberByMultiplyingBy:n2];

NSLog(@"%@",number);
}

可以把float、double转成NSDecimalNumber类型的对象在计算。可以进行+、-、* 、/ 的运算。

用法 四舍五入:

-(NSString*)notRounding:(float)price afterPoint:(NSInteger)position
{
NSDecimalNumberHandler* roundingHandler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:position raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]; NSDecimalNumber* returnNumber; NSDecimalNumber* ouncesDecimal = [[NSDecimalNumber alloc]initWithFloat:price]; returnNumber = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingHandler]; return [NSString stringWithFormat:@"%@",returnNumber];
}

测试数据:1.235

结果:

iOS - 处理计算精度要求很高的数据,floatValue,doubleValue等计算不精确问题的更多相关文章

  1. 📈📈📈📈📈iOS 图表框架 AAChartKit ---强大的高颜值数据可视化图表框架,支持柱状图、条形图、折线图、曲线图、折线填充图、曲线填充图、气泡图、扇形图、环形图、散点图、雷达图、混合图

    English Document

  2. java用double和float进行小数计算精度不准确

    java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非 ...

  3. 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)

    不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...

  4. xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

    问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了.但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高.用RandomFore ...

  5. JS数字计算精度误差的解决方法

    本篇文章主要是对javascript避免数字计算精度误差的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0. ...

  6. LK光流算法:提高计算精度和增加搜索范围

    LK光流算法:提高计算精度和增加搜索范围 关于LK算法的基本理论,见:http://www.cnblogs.com/dzyBK/p/4960630.html 这里主要阐述如何提高LK算法的计算精度和在 ...

  7. IOS 多个UIImageView 加载高清大图时内存管理

    IOS 多个UIImageView 加载高清大图时内存管理 时间:2014-08-27 10:47  浏览:59人 当我们在某一个View多个UIImageView,且UIImageView都显示的是 ...

  8. 关于JavaScript中计算精度丢失的问题

    摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失. 为了避免产生精度差异,把需要计算的数字升级(乘 ...

  9. HTML5-前端开发很火且工资很高?

    前言 晚上逛论坛看到一篇对从事HTML5前端开发的文章写的非常不错,和目前的市场形势差不多,然后我在其基础上给大家进行加工总结一下分享给大家.今天我们谈论的话题是<<为什么从事HTML5前 ...

随机推荐

  1. ul li列表元素浮动导致border没有底边解决办法

    如图,当ul li,li元素浮动,并且ul元素也overflow:hidden清除浮动的时候,给li元素加了border,但是不显示底边,这时候要看是不是没有给li元素加高,因为加了border之后默 ...

  2. Oracle:在 debian9 上完美安装 oracle 10.2.0.5 x64

    多余废话不说. 多动脑子,思路不要僵化. 关键点: --------------------------------------------------- 安装i386的支持库:libc6-dev:3 ...

  3. centos7 Minimal安装没有ifconfig

    centos7 Minimal  安装后 ip addr 系统的网卡没有分配IP地址 网卡为ens33 cd /etc/sysconfig/network-scripts vi ifcfg-ens33 ...

  4. 使用Eclipse构建Maven项目

    http://blog.csdn.net/qjyong/article/details/9098213

  5. QT编译错误:cannot find file: *.pro

    编译一个之前同事写的QT程序,结果出现了编译错误:cannot find file: *.pro 解决方法:将程序放在英文路径下 尽管出现一些红色的编译信息部门,但是最终还算是编译成功了~

  6. phpcms v9模板制作教程(转载)

    第一节 1.首先下载phpcms v9的集成安装包并安装,这里就不详细说明了. 2.本地调试建议大家使用APMserver,或者wampserver等,可以到PHPCMS吧官方网站首页链接下载.安装好 ...

  7. pycharm pro版本激活

    这几天行激活pycharm pro版会遇到问题,license server的网址都不可用了.包括各个网站的百度云的破解资源链接都被和谐了,发现最近jetbrains对盗版管得严. 首次安装在注册界面 ...

  8. android:versionCode和android:versionName 用途(转)

    转自:http://blog.csdn.net/wh_19910525/article/details/8660416 Android的版本可以在androidmainfest.xml中定义,主要有a ...

  9. 8 -- 深入使用Spring -- 0...

    要点梗概: 利用后处理器扩展Spring容器 Bean后处理器和容器后处理器 Spring3.0 的“零配置” 支持 Spring的资源访问策略 在ApplicationContext中使用资源 AO ...

  10. flexbox常用布局上下固定,中间滚动

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...