在iOS上,我尝试将数字1448924191存储为NSNumber,然后用floatValue检索它:
double max_float = MAXFLOAT; // really big num (3.4028234663852886E+38)
double someEpoch = 1448924191;
NSNumber *epochNum = [NSNumber numberWithDouble:someEpoch]; //但是,当我要求返回浮点数时,返回值被舍入到最近的60单位间隔:
float asFloat = [epochNum floatValue]; // 1448924160 - rounded to 60???
double asDouble = [epochNum doubleValue]; // 1448924191 - correct使用doubleValue解决了这个问题,但为什么呢?浮动不应该能够处理这个数字,因为它远小于FLOAT_MAX?
发布于 2015-12-01 01:01:51
正如在关于你的问题的评论中提到的,这是浮点数的一个基本限制。float on iOS是一个32位浮点数.其中一些位用于存储指数,因此可以存储的有效位数大大少于int中的数字数。
如果您使用#import <float.h>,您将访问许多宏,这些宏将告诉您浮点格式的详细信息,包括:
FLT_DIG 这是浮动数据类型的精度小数位数。从技术上讲,如果p和b分别是表示的精度和基数,那么十进制精度q是十进制数字的最大数目,这样任何带有q基10位数的浮点数都可以舍入到带有p基b位的浮点数,然后再返回,而不改变q小数。
这或多或少是指可以从int转换为float的最大数字中的数字数,而不会丢失任何精度。这实际上是一个保守的估计-你可以计算你可以存储在一个浮点中的绝对最大整数,通过对标题中的其他宏进行一些计算,尽管我怀疑这是你想要做的事情。
谈到从int到float的转换,您还应该注意到,在示例中的这一行代码中:
double someEpoch = 1448924191;您正在隐式地将整数1448924191转换为双表示形式。这很好,因为1448924191完全可以表示为双和int。如果使该值大于将适合于长int的值,则可能会出现奇怪的行为,因为常量将被存储为无符号的long,然后转换为double。当出现此错误时,编译器至少会警告您。
如果您想要一个双常数,您应该确保在值中包含一个小数点:
double someEpoch = 1448924191.0;如果你要立即将它赋值给一个双变量,这就不那么重要了,但是如果你定义了一个浮动常量,那么添加小数点是很有用的,以确保它在任何地方都被当作浮点值对待。
https://stackoverflow.com/questions/34009884
复制相似问题