昨天我遇到了一个我无法解释的问题。我正在编写一个非常简单的函数,将双数转换为long。这是另一个计划的一部分。我使用了以下代码:
long converter(double x) {
return (long) x;
}
在我输入1.9
作为输入并且结果为1
之前,它完美运行。但是1.9
更接近2
而不是1
。因此,结果应该是2
而不是1
。
为什么会出现这个问题?你能给我一个解决这个棘手问题的解决方案吗?
答案 0 :(得分:5)
将其投射到long
将不会像您预期的那样围绕它。它只会丢弃小数部分并给你整数部分。因此,您得到1
而不是2
。
您可以在此处参考std::lround
。
答案 1 :(得分:3)
施放到长时间不能正确舍入数字。为此,您必须使用std::lround()
。只需使用以下代码:
long converter(double x) {
return std::lround(x);
}
这应该可以完成工作。另外,请记住在代码中加入<cmath>
。否则,它可能无法正常工作。
P.S。 std :: lround()可能与旧编译器不兼容。所以,请记住使用最新版本的编译器。
答案 2 :(得分:2)
您可以使用
long converter(double x){
if(x>0)
return (long)(x+0.5);
else
return (long)(x-0.5);
}
当投掷丢弃小部分时,你无法得到你所期望的。如果分数大于'0.5',则添加'0.5'会将数字设为下一个长数。
答案 3 :(得分:0)
从浮点类型到整数类型的类型转换(如果它适合)将通过丢弃小数部分来实现。即1.9
转换为1
,-1.9
转换为-1
。
这样做的原因是由于浮点值的存储方式(如果存在歧义,他们可能会选择此转换在某种程度上定义实现)。该数字包含三个部分:符号,尾数和指数。这些是二进制的,但十进制等值为+1.9e+0
,其中+
是符号,1.9
是尾数,+0
是指数。如果您只是采用尾数并将其转换为整数,则将尾数+指数转换为整数变得非常容易和快速。之后,您应用该标志。因此操作变为掩盖尾数,指数然后进行移位,如果符号位被设置则最后否定。
如果他们选择实际进行适当的舍入,则只需要做更多的工作。该标准适用于定义演员阵容的更简单的解决方案。