【问题标题】:Difference between 1000 and 1000.0 in iOSiOS中1000和1000.0的区别
【发布时间】:2011-12-11 13:50:01
【问题描述】:

这里我有一个设置 NSTimer 对象的 fireDate 的代码。

-(void)TimerFired:(NSTimer*)timer{
    long startTime=random()%1500+500;
    [timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:startTime/1000.0]];
    [controller startCarFromLane:self];
}

在上面的代码中,当我编写 :startTime/1000.0 时,我会在相当长的时间后触发计时器。但是,如果我将其更改为 :startTime/1000 (不带 .0) 计时器的下一个 fireDate 与上述情况不同,则计时器会更频繁地触发。我知道 dateWithTimeIntervalSinceNow 方法需要一个 NSTimeInterval ,它是 double 的 typedef。但是我不能把 10.0 写成 10 吗? .0 对价值有何影响?

【问题讨论】:

  • 你可以改为写(float) 1000,但如果你像我一样懒惰,你会选择更短的1000.0

标签: objective-c ios nstimer


【解决方案1】:

当你简单地写 1000 时,编译器暗示一个整数类型。因此,当除以两个整数时(startTime 是一个 long 而 1000 可能是一个 int),它将是整数除法,导致准确(精确)比率的下限。例如,2500 / 1000 将是 2。但是,当您将 1000 写为 1000.0 时,编译器会发出一个浮点数。整数除以浮点数得到浮点数,因此 2500 / 1000.0 将是 2.5,正如预期的那样。基本上这就是为什么你在简单地使用整数时得到更短的间隔。 (换句话说,整数除法抛弃了除以除数的模数)。

【讨论】:

  • 是的,我肯定忘记了这样一个事实,即如果除数或除数中的任何一个是浮点数,那么结果将是一个浮点数。如果两边都是整数,则结果为整数,因此浮点右边的部分被截断。谢谢大家
【解决方案2】:

由于整数/长除法完全去掉了小数部分,并且因为您的startTime 被声明为long,所以startTime/1000 的结果是一个整数。 startTime/1000.0 的结果是双精度数,因为 1000.0 将除法的结果强制转换为 double。你也可以明确指定类型为double,如下面的sn-p:

-(void)TimerFired:(NSTimer*)timer{
    double startTime=random()%1500+500;
    [timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:startTime/1000]];
    [controller startCarFromLane:self];
}

【讨论】:

    【解决方案3】:

    对于1000,因为startTime 也是一个整数类型,所以你得到整数除法。 IE。如果startTime 小于 1000,则该除法将产生 0。

    使用1000.0,您可以获得浮点除法,这看起来就像您想要的那样。

    【讨论】:

      【解决方案4】:

      .0 使值成为浮点数而不是整数。当你划分整数时,你也会得到一个整数;也就是说,1/2 = 0。当你将浮点数相除时,你得到一个浮点数,即 1.0/2.0 = 0.5。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多