Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 53 * .01 = .531250_Iphone_Objective C_Floating Point_Nsnumber - Fatal编程技术网

Iphone 53 * .01 = .531250

Iphone 53 * .01 = .531250,iphone,objective-c,floating-point,nsnumber,Iphone,Objective C,Floating Point,Nsnumber,我正在将字符串日期/时间转换为数字时间值。在我的例子中,我只是用它来确定某个东西是否比其他东西新/旧,所以这个小的十进制问题不是一个真正的问题。它不需要精确到几秒钟。但它仍然让我挠头,我想知道为什么 我的日期以@“2010-09-08T17:33:53+0000”的字符串格式出现。所以我写了这个小方法来返回一个时间值。在任何人跳到28天或31天的月份有多少秒之前,我不在乎。在我的数学中,可以假设所有月份有31天,年份有31*12天,因为我不需要两个时间点之间的差异,只需要知道一个时间点是否比另一

我正在将字符串日期/时间转换为数字时间值。在我的例子中,我只是用它来确定某个东西是否比其他东西新/旧,所以这个小的十进制问题不是一个真正的问题。它不需要精确到几秒钟。但它仍然让我挠头,我想知道为什么

我的日期以@“2010-09-08T17:33:53+0000”的字符串格式出现。所以我写了这个小方法来返回一个时间值。在任何人跳到28天或31天的月份有多少秒之前,我不在乎。在我的数学中,可以假设所有月份有31天,年份有31*12天,因为我不需要两个时间点之间的差异,只需要知道一个时间点是否比另一个时间点晚

-(float) uniqueTimeFromCreatedTime: (NSString *)created_time {
float time;
    if ([created_time length]>19) {
      time = ([[created_time substringWithRange:NSMakeRange(2, 2)]floatValue]-10) * 535680; // max for 12 months is 535680.. uh oh y2100 bug!
      time=time + [[created_time substringWithRange:NSMakeRange(5, 2)]floatValue] * 44640; // to make it easy and since it doesn't matter we assume 31 days
      time=time + [[created_time substringWithRange:NSMakeRange(8, 2)]floatValue] * 1440;
      time=time + [[created_time substringWithRange:NSMakeRange(11, 2)]floatValue] * 60;
      time=time + [[created_time substringWithRange:NSMakeRange(14, 2)]floatValue];
      time = time + [[created_time substringWithRange:NSMakeRange(17, 2)]floatValue] * .01;
      return time;
    }
    else {
      //NSLog(@"error - time string not long enough");
      return 0.0;
    }
}
当传递上面列出的字符串时,结果应该是414333.53,但它返回的是414333.531250

当我在每次之间抛出一个NSLog=以跟踪其发生的位置时,我得到以下结果:

time 0.000000
time 401760.000000
time 413280.000000
time 414300.000000
time 414333.000000
floatvalue 53.000000
time 414333.531250
Created Time: 2010-09-08T17:33:53+0000 414333.531250

最后一个floatValue返回53.0000,但当我将其乘以.01时,它会变成.53125。我还尝试了intValue,它也做了同样的事情。

欢迎使用浮点舍入错误。如果您希望精度2为固定数量的小数点,请乘以100(对于2个小数点),然后
round()
将其除以100。只要这个数字不是非常大(占用的空间比我想象的57位还多),那么你应该很好,在除法上没有任何舍入问题


编辑:我的注释是57位,我假设是双精度的,浮点的精度要低得多。按照另一位读者的建议去做,如果可能的话,切换到double。

这是由一个经典的浮点错误引起的,该错误是由数字如何以位表示引起的。首先,使用double而不是float,因为它在现代机器上使用非常快。当结果真的很重要时,使用十进制类型,速度慢20倍,但精度100%。

IEEE浮点值只有24个尾数有效位(大约在7到8个十进制数字之间)。0.00125是414333.53和最近的浮点表示之间的第24位舍入误差,因为精确数字414333.53需要8位十进制数字。53*0.01在将其添加到更大的数字之前,其本身将得到更精确的结果,并在结果总和中失去精度。(这说明了为什么在使用浮点运算进行计算时,从数值的角度来看,大小非常不同的数字之间的加减不是一件好事。)

您可以尝试将所有常量乘以100,这样就不必除法了。除法是导致问题的原因,因为除以100会产生二进制的重复模式。

您可以使用
+dateWithString:
方法从这些
NSString
日期中创建
NSDate
实例。它接受格式化为
YYYY-MM-DD HH:MM:SS±HHMM
的字符串,这就是您要处理的内容。一旦你有了两个
NSDate
s,你就可以使用
-compare:
方法来查看哪一个是更晚的时间。

只是一个建议,但NSDate确实是在平台上处理日期和时间的简便方法。我认为,NSDate将为你节省数小时的时间:是的,
NSDate
+
NSDateFormatter
。阅读:希望它能让我勾选所有好的答案,因为这里不止一个。我在代码的其他区域使用NSDate,但在这种情况下,我认为将数字转换为NSDate信息和。。男人。。听起来比这更痛苦。对于这个例子,我只需要排除我以前看过的信息,我在30秒内写了这个,它做了我需要它做的事情(舍入误差除外)。我可能有点老派,但我尽量不担心没有人会看到或使用的细节。。但是谢谢你的帮助!这也是一个很好的建议。我可以把它们都勾选出来。我也会把这个想法保留到一半。