如何安全地将此双重转换为int?

时间:2011-02-02 18:51:24

标签: objective-c c

我有一个双倍的时间间隔,以秒为单位。有效值为0.0,0.5,1.0,1.5等。

现在我需要将此值转换为int。但我不能这样做:

int converted = (int)theDouble;

因为可能发生的事情是,由于浮点错误导致我的双倍是0.999999999而不是1.000000000。它会切断尾部,我们最终会得到0而不是1.另外,当我的double是0.9时,我想要一个1的int。当它是1.1时,我希望int为1。它是1.8,我希望int为2。

有一个round()函数,但Xcode没有显示这方面的文档。标题只告诉它返回一个double。所以不是我需要的。

获得该double的close int表示的最安全的方法是什么?虽然它是双倍的,但我永远不需要比0.5或一个碎片数字更高的精度(我不是数学天才,也不知道确切的科学术语)。

5 个答案:

答案 0 :(得分:7)

你可能正在寻找lround(双重功能)。 签名看起来像这样。

long int lround(double)。

其他选项

  • long int lrint(double)
  • long long int llrint(double)
  • long long int llround(double)

答案 1 :(得分:5)

int converted = (int)round(theDouble);

答案 2 :(得分:4)

这样做:

int converted = (int)(round(theDouble));

答案 3 :(得分:2)

round中使用math.h。它返回一个double,但在你的情况下,你可以将它转换为int。或者使用lround(也在math.h中),它取一个double并返回一个long int。

答案 4 :(得分:2)

正如其他人所建议的那样,您可以对theDouble进行舍入,但请记住,您不应该依赖浮点变量来获得精确的精度。您应该执行以下操作:

,而不是尝试将theDouble与整数进行比较
if (abs(theDouble - theInteger) <= 0.000001)
    doSomething();

请记住,在比较之前,整数将被转换为双精度,所以它可能也不准确。

最后一件事,打电话:

int converted = (int) round(theDouble)

稍微有些危险,因为正如您所说,浮点错误可能会降低值。如果你知道你的价值只有0,0.5,1.0,1.5 ......,为什么不这样做?:

int converted = (int) (round(theDouble) + 0.1)