如何安全地将此双精度浮点数转换为整数?

5

我有一个double类型的变量,表示时间间隔(单位为秒)。有效值为0.0、0.5、1.0、1.5等。

现在我需要将这个值转换为int类型。但是我不能直接这样做:

int converted = (int)theDouble;

因为浮点数误差的原因,可能会出现我的双精度浮点数是0.999999999而不是1.000000000的情况。它只会截取尾数,最终得到的结果是0而不是1。此外,当我的双精度浮点数为0.9时,我希望得到一个整数1;当它为1.1时,我希望整数为1;当它为1.8时,我希望整数为2。
虽然有一个round()函数,但Xcode没有提供文档。头文件仅说明它返回一个双精度浮点数,所以这并不是我需要的。
最安全的方式是获取该双精度浮点数的近似整数表示。尽管它是双精度浮点数,但我永远不需要比0.5或一个小数位更高的精度(我不是数学天才,也不知道确切的科学术语)。
5个回答

7

您可能正在寻找lround(double函数)。

签名如下。

long int lround(double)。

其他选项包括

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

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

4
做这个:

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

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)

2

使用 math.h 中的 round 函数,它返回一个双精度浮点数,但在您的情况下可以将其转换为整数。或者使用 math.h 中的 lround 函数,它接受一个双精度浮点数并返回一个长整型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接