V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhangchioulin
V2EX  ›  问与答

请教一下关于 OC 中基本数据类型转换的问题,谢谢

  •  
  •   zhangchioulin · 2015-11-01 00:03:40 +08:00 · 1719 次点击
    这是一个创建于 3318 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我从服务器上取得了一串 double 型数据 24.72
    于是我在接收的时候用
    float amount = [[moneyDic objectForKey:@"amount"] floatValue];
    这样接收下来的 amount 就变成了 24.71999993

    后来把代码拆开来了
    NSNumber *amountNumber = [moneyDic objectForKey:@"amount"];
    amount = [amountNumber floatValue];
    这种情况下:amountNumber 能正常显示 24.72 但是一旦用 floatValue 转换 数字就变成了 24.71999993


    用 double 也不行同样会出现上面错误,最后用 NSDecimalNumber 解决的,但是想知道为什么,难道是因为 float 精度不够吗?
    5 条回复    2015-11-01 17:35:44 +08:00
    superpeaser
        1
    superpeaser  
       2015-11-01 02:04:35 +08:00 via iPhone
    用字符串
    jesse_luo
        2
    jesse_luo  
       2015-11-01 02:10:58 +08:00
    用 doubleValue 试试呗
    用 string 传试试呗
    用分作为单位,传整形试试呗
    zhangchioulin
        3
    zhangchioulin  
    OP
       2015-11-01 13:54:57 +08:00
    @jesse_luo doubleValue 转也会出题
    YuJianrong
        4
    YuJianrong  
       2015-11-01 17:03:26 +08:00   ❤️ 1
    1. 不应该说浮点精度不够,而是浮点本来就无法精确表达某些数字,你再提高的精度(不管是 64 位浮点还是 128 位浮点)都一样。
    2. 但是,一个统一的浮点<-->字符串转换方法理论上能够无损地转换,所以如果:
    [源代码有 a=24.72 字符串,经过编译产生变量]->[服务器内存中的 float] -> [服务器内存中的字符串] -> [json/xml 网络数据传输] -> [客户端内存字符串] ->[客户端内存的 float] ->[客户端内存中显示用字符串] ->[显示给用户]
    这里面所有的浮点<-->字符串转换方法是统一的话,用户就会看到源代码的 24.72 。
    然而如果任何一步并不统一(考虑到你后台不大可能是 ObjC 的话),或者这个 24.72 不是源代码而是计算而来的话,显然就不能保证用户最后看到啥了。
    3. 说那么多的意思是精确的话要么*100 按整数来(也就是用定点小数不要用浮点),要么用字符串或者前后统一的 BigDecimal
    zhangchioulin
        5
    zhangchioulin  
    OP
       2015-11-01 17:35:44 +08:00
    @YuJianrong 感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   968 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:11 · PVG 04:11 · LAX 12:11 · JFK 15:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.