double精度丢失 ios_double 丢失精度 ios - CSDN
  • 开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:经过测试其实系统NSDecimalNumber是对有问题值做了四舍五入...

    开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:
    经过测试其实系统NSDecimalNumber是对有问题值做了四舍五入处理


        •    还有经过测试, 重要的事说三遍:
处理精度有关的数据请用double
处理精度有关的数据请用double
处理精度有关的数据请用double
        float testDouble = [jsonDict[@"Body"][@"Amount"] floatValue]; //有问题 90.989999999999994
        NSString *convertString = decimalNumberWithString([jsonDict[@"Body"][@"Amount"] stringValue]);
        NSLog(@"%@", convertString);
           testDouble的值     原始值& NSDecimalNumber处理后打印后的值
    //    99.489999999999994 99.49
    //    99.989999999999994 99.99
    //    90                 90.00
    //    90.090000000000003 90.09
    //    90.189999999999998 90.19
    //    90.290000000000006 90.29
    //    90.39              90.39
    //    90.489999999999994 90.49
    //    90.590000000000003 90.59
    //    90.689999999999998 90.69
    //    90.790000000000006 90.79
    //    90.89              90.89
    //    90.989999999999994 90.99


    对此自己写了个方法处理 :
    /** 直接传入精度丢失有问题的Double类型*/
    NSString *decimalNumberWithDouble(double conversionValue){
        NSString *doubleString        = [NSString stringWithFormat:@"%lf", conversionValue];
        NSDecimalNumber *decNumber    = [NSDecimalNumber decimalNumberWithString:doubleString];
        return [decNumber stringValue];
    }
    强烈建议 :
       有关浮点型数据,后台传字符串的格式,防止丢失精度。

    转载于:https://www.cnblogs.com/yujidewu/p/6103913.html

    展开全文
  • 解决一个价格转换显示的bug double a=Double.parseDouble(3.80); long price=new Double(a*100).longValue();结果是3.799999999.......大部分程序员都知道浮点类型不能用来做精确表示和运算,对根本原因能随口说来的...
    解决一个价格转换显示的bug
    double a=Double.parseDouble(3.80);
    long price=new Double(a*100).longValue();
    结果是3.799999999.......
    大部分程序员都知道浮点类型不能用来做精确表示和运算,对根本原因能随口说来的可能并不多,借着这次机会,把涉及到计算机原理的知识点剖析下。
    出现上述结果的根本原因是计算机使用二进制01无法准确表示某些带小数位的十进制数据
    十进制数据转换成二进制数据,需经过如下计算:
    1、整数部分
    用该整数连续除以2,取余数,商再除以2,直到商等于0为止,最后把得到的余数按相反的顺序排列,即“除2取余法”
    2、小数部分
    小数部分“乘2取整,顺序排列”法,小数部分乘以2,从乘积中取整数部分,剩余的小数部分乘以2,
    再把乘积的整部部分取出,剩余的小数部分乘以2,直到乘积中的小数部分为0或达到所要求的精度为止,把取出的整数部分顺序排列,即“乘2取整法”。
    3、相加
    最后把整数部分和小数部分相加,得到二进制数据
    例如:十进制的3.8转换成二进制数值,步骤如下:
    3(整数部分)
    3/2=1................1
    1/2=0.................1
    十进制3 转换为二进制 11
    0.8(小数部分)
    0.8*2=1.6................1
    0.6*2=1.2.................1
    0.2*2=0.4.................0
    0.4*2=0.8.................0
    0.8*2=1.6................1
    ....
    十进制0.8 转换为二进制 (0.11001100.....) 后边无限循环1100这段二进制数值,因此也就出现了上述的3.799999的情况。

    java 的浮点类型都依据 IEEE 754 标准。IEEE 754 定义了32 位和 64 位双精度两种浮点二进制小数标准。
    IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。32 位浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数 2 )小数来表示。对于64位双精度浮点数,用 1 位表示数字的符号,用 11 位表示指数,52 位表示尾数。
    在 IEEE 754 的 double 没有办法表示出 0.8,只能得到一个近似值。
    float和double只能用来做科学计算或者是工程计算,在商业计算等精确计算中,用java.math.BigDecimal。
    BigDecimal的解决方案就是,不使用二进制,而是使用十进制(BigInteger)+小数点位置(scale)来表示小数。
    上述的39.8=398 * 0.1^1 这种表示方式下,避免了小数的出现,就不会有精度问题了。
    展开全文
  • 近日,项目中出现了后台返回数据,特别是价格时,小数位会出现很多9999的现象,而在谷歌浏览器测试后台返回数据时,正常显示是只有2位,后台也说只返给了2位小数给我,百思不得其解,只能认为是开发环境不同造成的...

    近日,项目中出现了后台返回数据,特别是价格时,小数位会出现很多9999的现象,而在谷歌浏览器测试后台返回数据时,正常显示是只有2位,后台也说只返给了2位小数给我,百思不得其解,只能认为是开发环境不同造成的问题。之前的解决方案是利用 %.2f 进行截取四舍五入,其实可以正常使用,只是保留了两位小数。

    现在发现其实是,NSNumber的description方法不够严谨,在调用NSNumber的description方法打印数值时,会发生精度损失。如果是double类型,建议把NSNumber转换成double再进行输出或计算。


    用json格式化工具或谷歌浏览器json解析插件显示的正常的:


    如何解决:

    在后台返回float或者double类型时,利用NSDecimalNumber处理精度丢失问题。此处我是以string方式接收的,直接添加NSString的分类,修正方法贴出来如下:

    /*!
     @brief 修正浮点型精度丢失
     @param str 传入接口取到的数据
     @return 修正精度后的数据
     */
    +(NSString *)reviseString:(NSString *)str
    {
        //直接传入精度丢失有问题的Double类型
        double conversionValue = [str doubleValue];
        NSString *doubleString = [NSString stringWithFormat:@"%lf", conversionValue];
        NSDecimalNumber *decNumber = [NSDecimalNumber decimalNumberWithString:doubleString];
        return [decNumber stringValue];
    }

    我遇到的并不是所有解析出的小数都是精度丢失的,同一个接口内有部分数据如此,且安卓并未出现,所以这边在前端可以自己处理下。

    或者让后台返回时返字符串类型的数据,不返NSNumber类型。



    展开全文
  • iOS 解决json解析过程中浮点型字符串精度丢失的问题 @brief 修正浮点型精度丢失 @param str 传入接口取到的数据 @return 修正精度后的数据 */ +(NSString *)reviseString:(NSString *)str { //直接传入精度丢失有...

    iOS 解决json解析过程中浮点型字符串精度丢失的问题

    
    @brief 修正浮点型精度丢失
    @param str 传入接口取到的数据
    @return 修正精度后的数据
    */
    +(NSString *)reviseString:(NSString *)str
    {
     //直接传入精度丢失有问题的Double类型
     double conversionValue = [str doubleValue];
     NSString *doubleString = [NSString stringWithFormat:@"%lf", conversionValue];
     NSDecimalNumber *decNumber = [NSDecimalNumber decimalNumberWithString:doubleString];
     return [decNumber stringValue];
    }
    
    
    展开全文
  • 当设计到金钱的计算....1:控制double类型的精度  double abc = 0.1 - 0.01 - 0.00001009;  NSNumberFormatter *nf = [[NSNumberFormatteralloc ]init];  [nf setMaximumIntegerDigits:8];  NSNu
  • 如图,网络请求返回的浮点数精度丢失,直接展示肯定是有问题的。 使用时保留两位小数并去掉末尾的0 + (NSString *)dealwithJDDSWithFloat:(float)number { NSString *jqStr = [NSString stringWithFormat:@"%.2f...
  • 开发中处理处理数字、价格金额等问题时, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题,因此使用系统自带的NSDecimalNumber做处理, 能解决这问题: 经过测试其实系统NSDecimalNumber是对有问题值做了...
  • 当json字典中含有一位及以上小数位时,在使用NSJSONSerialization方法先转为NSData再解析为字符串时有时会出现数据误差,代码如下: NSString *jsonStr = @"{"number":81.6}"; ... = ...
  • iOS 浮点数 精度丢失 doubleValue floatValue NSString iEEE
  • iOS 中经常会计算金额和价格,我们有时会定义数据类型为 double 或者 float,这样在做过一些运算后会发现精度丢失了,这显然不是我们想要的结果。今日偶然间看到一篇技术博文,为了记忆,顺道解决我的这个问题,...
  • 我们提到计算机内部是无法用浮点数精确表示一些大部分实数的,但在涉及到金额交易的业务场景中,我们真的对精度问题束手无策吗?显然不是。Foundation 框架中内置了高精度算法处理库 NSDecimalNumber.h 用于处理一切...
  • ios在获取json数据后通常使用NSJSONSerialization解析成字典便于使用 NSData *jsonData_ = [html dataUsingEncoding:NSUTF8StringEncoding]; NSError *jsonParsingError_ = nil; NSMutableDictionary *dic = ...
  • iOS 解决数值计算(floatValue,doubleValue)不精确问题,一句话解决精确计算,精确比较
  • 今天需要用到经纬度,传值之后需要转为double,在网上找方法,偶然看到了,不正当转换可能会导致精度损失,所以特意找了一下不损失精度的方法,用BigDecimal。用法如下BigDecimal maxlng1 = new BigDecimal(jdwd.get...
  • 本文装载自:... BigDecimal在浮点型数据计算丢失精度的常见案例: [java] view plain copy package com.mmall.test; import org.junit.Test; import java.math.BigDe...
  • 请问怎么将double转成string才能不损失数据本身的小数位数呢,例如,将1.000转换为“1.000” 直接转换会变成1,而使用format则需要指定保留小数点位数,否则自动保留6位 可不可以什么都不要做,我就想转个字符串而已...
  • 前几天项目中遇到一个商品价格丢失精度的问题。 服务端返回的价格是number类型; 我用上面的方式,将接受到的二进制数据responseObject转成json发现价格是80.0400000000001;但是安卓同事说他接收到的数据就是80.04...
  • ios 浮点数精度问题

    2016-03-31 15:11:09
    之前一直在写Java,涉及到精度问题,一般用java的BigDecimal就能解决,最近遇到ios项目中一些精度问题,我们平时用的最多的应该是float,double之类的,当然ios还有一个类CGFloat,这个类包含了float和double,然后...
  • float类型只能够表示数字中的前6位或者前7位。 #include <iostream> using namespace std; int main() { float a = 2.3400001E+7f;... cout.setf(ios::fixed); cout << "a = " &l...
1 2 3 4 5 ... 20
收藏数 1,051
精华内容 420
关键字:

double精度丢失 ios