我有一个双倍的时间间隔,以秒为单位。有效值为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或一个碎片数字更高的精度(我不是数学天才,也不知道确切的科学术语)。
答案 0 :(得分:7)
你可能正在寻找lround(双重功能)。 签名看起来像这样。
long int lround(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)