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

2015-11-01 00:03:40 +08:00
 zhangchioulin
我从服务器上取得了一串 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 精度不够吗?
1713 次点击
所在节点    问与答
5 条回复
superpeaser
2015-11-01 02:04:35 +08:00
用字符串
jesse_luo
2015-11-01 02:10:58 +08:00
用 doubleValue 试试呗
用 string 传试试呗
用分作为单位,传整形试试呗
zhangchioulin
2015-11-01 13:54:57 +08:00
@jesse_luo doubleValue 转也会出题
YuJianrong
2015-11-01 17:03:26 +08:00
1. 不应该说浮点精度不够,而是浮点本来就无法精确表达某些数字,你再提高的精度(不管是 64 位浮点还是 128 位浮点)都一样。
2. 但是,一个统一的浮点<-->字符串转换方法理论上能够无损地转换,所以如果:
[源代码有 a=24.72 字符串,经过编译产生变量]->[服务器内存中的 float] -> [服务器内存中的字符串] -> [json/xml 网络数据传输] -> [客户端内存字符串] ->[客户端内存的 float] ->[客户端内存中显示用字符串] ->[显示给用户]
这里面所有的浮点<-->字符串转换方法是统一的话,用户就会看到源代码的 24.72 。
然而如果任何一步并不统一(考虑到你后台不大可能是 ObjC 的话),或者这个 24.72 不是源代码而是计算而来的话,显然就不能保证用户最后看到啥了。
3. 说那么多的意思是精确的话要么*100 按整数来(也就是用定点小数不要用浮点),要么用字符串或者前后统一的 BigDecimal
zhangchioulin
2015-11-01 17:35:44 +08:00
@YuJianrong 感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/232595

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX