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

Pro*_*ber 5 c objective-c

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

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

int converted = (int)theDouble;
Run Code Online (Sandbox Code Playgroud)

因为可能发生的事情是,由于浮点错误,我的双倍是0.999999999而不是1.000000000.它只是切断尾巴,我们就结束了0,而不是1.此外,当我的双0.9,我想一个int是1.当它是1.1,我想INT为1时它是1.8,我希望int为2.

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

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

Var*_*ath 7

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

long int lround(double).

其他选择是

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


Noa*_*oon 5

int converted = (int)round(theDouble);
Run Code Online (Sandbox Code Playgroud)


Lan*_*opp 2

正如其他人所建议的,您可以舍入theDouble,但请记住,您永远不应该依靠浮点变量来获得精确的精度。您应该执行以下操作,而不是尝试theDouble与整数进行比较是否相等:

if (abs(theDouble - theInteger) <= 0.000001)
    doSomething();
Run Code Online (Sandbox Code Playgroud)

请记住,在比较之前,theInteger 将被转换为 double,因此它也可能不精确。

最后一件事,打电话:

int converted = (int) round(theDouble)
Run Code Online (Sandbox Code Playgroud)

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

int converted = (int) (round(theDouble) + 0.1)
Run Code Online (Sandbox Code Playgroud)