我有一个双倍,这是一个以秒为单位的时间间隔.有效值为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或一个碎片数字更高的精度(我不是数学天才,也不知道确切的科学术语).
你可能正在寻找lround(双重功能).签名看起来像这样.
long int lround(double).
其他选择是
正如其他人所建议的,您可以舍入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)