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前 ...
随机推荐
- js实现图片粘贴上传到服务器并展示
最近看了一些有关于js实现图片粘贴上传的demo,实现如下: (这里只能检测到截图粘贴和图片右键复制之后粘贴) demo1: document.addEventListener('paste', fu ...
- mysql覆盖索引(屌的狠,提高速度)
话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...
- python之文件目录和路径
1.路径中不要出现中文,否则有极大可能报错 2.反斜杠问题 举例说明: 我们从Windows复制的文件路径是G:\beifen\Tea. 可以看到,路径用的是反斜杠:\. 由于反斜杠\在python里 ...
- 织梦Dedecms系统可疑文件include/filter.inc.php扫描出漏洞,该如何解决?
今天在做网站监察的时候,发现网站出了一个问题,在对网站做木马监测的时候,扫描出一个可疑文件:/include/filter.inc.php,建议删除,但仔细检查后,发现此文件是织梦(Dedecms)系 ...
- python中是否有单独的字符类型,通过下标的方式表示字符串中的字符
说明: 在python中,没有单独的字符类型,一个字符呢就是一个大小为1的字符串. 并且可以通过下标的方式,表示字符串中的字符. 操作过程: 1.通过[ ]的方式表示字符串中的第几个字符 >&g ...
- java的this static public protected private abstract interface 在python的对应,java python一些区别
1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...
- js中===与==区别
本文出自:http://www.cnblogs.com/yiki/archive/2012/05/08/2489687.html 1.对于string,number等基础类型,==和===是有区别的 ...
- [AX]AX2012 Interaction class
Ax2012 Client的form如果属性FormTemplate设置为DetailsPage或者ListPage,则必须同时设置属性InteractionClass为相应的Interaction类 ...
- VS中自定义代码段
如果数据属性的数量比较多,那么输入总是要花费较多的时间,这里有个小技巧,就是使用快捷的输入方法,但是VS自身提供的代码段是有限的,幸运的是我们可以通过:工具> 代码段管理器>添加来添加自定 ...
- argc和argv
ARGc和ARGv中的ARG指的是"参数"(外语:ARGuments, argument counter 和 argument vector ) argc: 整数,用来统计你运行程 ...