iOS - 处理计算精度要求很高的数据,floatValue,doubleValue等计算不精确问题
、问题描述:服务器返回的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等计算不精确问题的更多相关文章
- 📈📈📈📈📈iOS 图表框架 AAChartKit ---强大的高颜值数据可视化图表框架,支持柱状图、条形图、折线图、曲线图、折线填充图、曲线填充图、气泡图、扇形图、环形图、散点图、雷达图、混合图
English Document
- java用double和float进行小数计算精度不准确
java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非 ...
- 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)
不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...
- xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?
问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了.但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高.用RandomFore ...
- JS数字计算精度误差的解决方法
本篇文章主要是对javascript避免数字计算精度误差的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0. ...
- LK光流算法:提高计算精度和增加搜索范围
LK光流算法:提高计算精度和增加搜索范围 关于LK算法的基本理论,见:http://www.cnblogs.com/dzyBK/p/4960630.html 这里主要阐述如何提高LK算法的计算精度和在 ...
- IOS 多个UIImageView 加载高清大图时内存管理
IOS 多个UIImageView 加载高清大图时内存管理 时间:2014-08-27 10:47 浏览:59人 当我们在某一个View多个UIImageView,且UIImageView都显示的是 ...
- 关于JavaScript中计算精度丢失的问题
摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失. 为了避免产生精度差异,把需要计算的数字升级(乘 ...
- HTML5-前端开发很火且工资很高?
前言 晚上逛论坛看到一篇对从事HTML5前端开发的文章写的非常不错,和目前的市场形势差不多,然后我在其基础上给大家进行加工总结一下分享给大家.今天我们谈论的话题是<<为什么从事HTML5前 ...
随机推荐
- Android开发学习笔记-自定义组合控件的过程
自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...
- 针对降质模型中的模糊SR
(PDF) Deep Plug-and-Play Super-Resolution for Arbitrary Blur Kernels https://www.researchgate.net/pu ...
- [转] 关于QT的系统总结
出处:http://www.cnblogs.com/wangqiguo/p/4625611.html 阅读目录 编译环境与开发流程 QT项目的构成及原理 QT中的布局 QT中的通用控件 QVarian ...
- linux环境中通过useradd命令,创建用户的时候指定用户的base-dir
需求说明: 今天一个同事,问了一个这样的问题,在linux环境中,创建用户的时候,默认的是在/home目录下创建一个与用户名相同的家目录, 如何能够将这个/home更换成一个其他的,比如/opt/ap ...
- 用VS2012不能打开VS2010的项目
应该是装过sql2012或者sql2008,自带的那个visual studio,你可以直接在外面打开VS2012,然后用里面的文件去打开项目.而不要直接双击那个解决方案的文件.
- iOS6 中 Smart App Banners介绍和使用(转自COCOACHINA.COM)
转自:http://www.cocoachina.com/applenews/devnews/2012/0924/4842.html iOS 6新增Smart App Banners,也就是“智能Ap ...
- 有人在群里问mysql如何选择性更新部分条件的问题
有人在群里问这个问题 update xt_kh set zhye=zhye+1,hzyj=hzyj+1 where dlgh='kiss0451' and hzms=1 如果这样写 hzms不等于1的 ...
- MvvmLight学习篇—— Mvvm Light Toolkit for wpf/silverlight系列(导航)
系列一:看的迷迷糊糊的 一.Mvvm Light Toolkit for wpf/silverlight系列之准备工作 二.Mvvm Light Toolkit for wpf/silverlight ...
- 【Android】ProgressBar
http://www.cnblogs.com/wangying222/p/5304990.html http://www.cnblogs.com/plokmju/p/android_ProgressB ...
- mysql中concat 和 group_concat()的用法
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...