、问题描述:服务器返回的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. [转载]Android 生成keystore,两种方式

    Refer : http://blog.csdn.net/ms03001620/article/details/8490314 一.eclipse 中生成android keystore 建立任意一个 ...

  2. QT 运行崩溃:The inferior stopped because it received a signal from the Operating System

    最近在研究QT自带的boxes例子,自己派生一个图形项,但是在运行生成该图形项时程序直接退出了~ Qt Creater调试代码,问题定位如下代码行: 执行1270行时弹出错误消息框: 于是上网查找资料 ...

  3. WCF服务支持HTTP(get,post)方式请求例子

    https://www.cnblogs.com/li150dan/p/9529413.html /// <summary> /// Http Get请求 /// </summary& ...

  4. instsrv.exe srvany.exe启动服务

    1.通过注册表注册服务 private static readonly string regpath = @"SYSTEM\CurrentControlSet\Services\Consul ...

  5. SpringMVC------报错:java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter

    详细信息: java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 严重: E ...

  6. C#------如何使用Swagger调试接口

    1.打开NuGet程序包 2.安装下面两个程序包 3.安装完后会出现SwaggerConfig.cs类,并修改里面的内容 代码: [assembly: PreApplicationStartMetho ...

  7. mysql触发器的使用 想让b字段在更新的时候把旧数据保存到a字段中

    使用mysql希望数据库自动触发一些规则,进行更新数据的时候,就需要用触发器了,比如 将旧数据保存到额外字段中,如何做呢? 在abc表中 name更新的时候 我希望把name的老数据保存到 old_n ...

  8. centos 上不了网了

    昨天还用的好好的,今天就上不了网了,郁闷,不过,正好是一次学习linux网络配置的好机会,这会已经把它折腾好了,此文就是在linux下面的浏览器中写的! 先检查一下虚拟机中的网络设置是否正常,由于我的 ...

  9. UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multib

    [问题] 在执行代码时,提示上述错误,源码如下: # 下载小说... def download_stoy(crawl_list,header): # 创建文件流,将各个章节读入内存 with open ...

  10. Android实现图片缩放示例

    package com.example.demo; import android.os.Bundle; import android.app.Activity; import android.grap ...