objective-c – NSNumber和float – 类型铸造古怪
发布时间:2020-12-16 07:03:24 所属栏目:百科 来源:网络整理
导读:在我的应用程序中,我使用的是使用json进行通信的外部API.今天我在浮动和NSNumber之间遇到了奇怪的事情(可能是由于我在iOS上缺乏经验而感到奇怪).问题是我在API响应中收到一个浮点数,在这种特殊情况下它是135.99.当本机obj-c json解析器解析响应时,它会使用该
在我的应用程序中,我使用的是使用json进行通信的外部API.今天我在浮动和NSNumber之间遇到了奇怪的事情(可能是由于我在iOS上缺乏经验而感到奇怪).问题是我在API响应中收到一个浮点数,在这种特殊情况下它是135.99.当本机obj-c json解析器解析响应时,它会使用该值创建NSNumber.它完美无缺.但是当我开始使用这个API时,我不知道原生的json解析器是怎么回事,所以我一直在做这样的事情:
NSNumber * number = [NSNumber numberWithFloat:[[response objectForKey:@"Number"] floatValue]]; 所以,上面发生的事实上是将NSNumber转换为float并使用该float创建新的NSNumber.有什么奇怪的呢?奇怪(对我来说)是上面的行生成NSNumber值为135.99001而不是135.99这是正确的. 我知道浮点数算法真的搞砸了,特别是像PHP这样的语言(0.2 0.7不等于0.9),但是我没想到像Objective-c这样的语言,这是C语言的超集,我会发现这样的混乱至.有没有人对这个问题有一个很好的解释? 解决方法
你正在犯一个初学者的错误,那就是假设“float”是浮点数的正确类型.不是.除非你有充分的理由使用float,否则“double”是你应该使用的类型. JSON解析器将不可避免地使用[NSNumber numberWithDouble:…]来创建它们存储的NSNumber对象(或[NSNumber numberWithLongLong:…]或NSDecimalNumber),但永远不会[NSNumber numberWithFloat:].
与double相比,float的精度非常有限.你可以肯定,在大多数情况下,由于精度有限,[NSNumber numberWithFloat:…]会给你不同的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- CAS 3.4 单点退出详细配置(Configuring Single Sign Out )
- ajax使用总结-ajax的配置-ajax的调用-ajax的中文乱码-ajax的
- COM“可重用性”的两种模型:包容和聚合
- postgresql数据库的备份和还原
- Swift编程规范之 Coding Style
- 正则表达式 – 匹配没有前导和尾随空格的字符串
- quick-cocos2d-x 2.2.5 创建工程
- 8.java设计模式之装饰者模式
- NO.79 JSONObject.fromBean java.sql.Date.getHours Illega
- Swift 关联Storyboard中的controller解决UICollectionView