2011-02-02 28 views
5

我有一个双倍的时间间隔,以秒为单位。有效值为0.0,0.5,1.0,1.5等。如何安全地将这个double转换为int?

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

int converted = (int)theDouble; 

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

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

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

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

回答

2

正如其他人所建议的,你可以舍入theDouble,但请记住,你不应该依赖浮点变量来获得精确的精度。不要试图与平等的整数比较theDouble,你应该做这样的事情:

if (abs(theDouble - theInteger) <= 0.000001) 
    doSomething(); 

记住,theInteger会比较之前要转换为双,所以它可能不准确或者。

最后一两件事,称:

int converted = (int) round(theDouble) 

稍微危险的,因为,如你所说,浮点错误可能带来的价值下降。如果你知道你的价值只会是0,0.5,1.0,1.5,...为什么不做这样的事情?:

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

执行此操作。它会返回一个double,但在你的情况下,你可以把它转换为int。或者使用lround(同样在math.h),它需要一个double并返回一个long int。

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

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

long int lround(double)。

其他选项是

  • 长整型lrint(双)
  • 长的长整型llrint(双)
  • 长的长整型llround(双)