为什么(长)总是将数字四舍五入?

时间:2015-09-27 09:23:21

标签: c++ c++11

昨天我遇到了一个我无法解释的问题。我正在编写一个非常简单的函数,将双数转换为long。这是另一个计划的一部分。我使用了以下代码:

long converter(double x) {
return (long) x; 
}

在我输入1.9作为输入并且结果为1之前,它完美运行。但是1.9更接近2而不是1。因此,结果应该是2而不是1

为什么会出现这个问题?你能给我一个解决这个棘手问题的解决方案吗?

4 个答案:

答案 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是指数。如果您只是采用尾数并将其转换为整数,则将尾数+指数转换为整数变得非常容易和快速。之后,您应用该标志。因此操作变为掩盖尾数,指数然后进行移位,如果符号位被设置则最后否定。

如果他们选择实际进行适当的舍入,则只需要做更多的工作。该标准适用于定义演员阵容的更简单的解决方案。