C++ 为什么(长)总是把数字四舍五入?

C++ 为什么(长)总是把数字四舍五入?,c++,c++11,C++,C++11,昨天我遇到了一个我无法解释的问题。我正在编写一个非常简单的函数,将双倍数转换为长数。这是另一个项目的一部分。我使用了以下代码: long converter(double x) { return (long) x; } long converter(double x) { return std::lround(x); } 它工作得很好,直到我输入1.9作为输入,结果是1。但是1.9比1更接近2。因此,结果应该是2而不是1 为什么会出现这个问题?你能给我一个解决这个令人恼火的问题的办法吗?

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

long converter(double x) {
return (long) x; 
}
long converter(double x) {
return std::lround(x); 
}
它工作得很好,直到我输入1.9作为输入,结果是1。但是1.9比1更接近2。因此,结果应该是2而不是1

为什么会出现这个问题?你能给我一个解决这个令人恼火的问题的办法吗?

把它拖得太久并不能像你期望的那样解决它。它将丢弃小数部分,并将为您提供整数部分。因此,得到的是1而不是2

你可以在这里查阅。

你可以使用like

long converter(double x){
if(x>0)
    return (long)(x+0.5);
else
    return (long)(x-0.5);
}

作为一部分,你不能得到你所期望的。如果分数大于“0.5”,则添加“0.5”将数字带到下一个长分数

铸造到long不能正确舍入一个数字。为此,必须使用std::lround。只需使用以下代码:

long converter(double x) {
return (long) x; 
}
long converter(double x) {
return std::lround(x); 
}
这应该可以完成工作。此外,请记住在代码中包含。否则,它可能不起作用


p.S.std::lround可能与旧的编译器不兼容。因此,请记住使用最新版本的编译器。

如果合适,从浮点类型转换为整数类型只需丢弃小数部分即可。即1.9转换为1,-1.9转换为-1

这样做的原因是由于浮点值的存储方式,如果这里有歧义,他们可能会选择在某种程度上实现定义这种转换。数字由三部分组成:符号、尾数和指数。它们是二进制的,但十进制等价物是+1.9e+0,其中+是符号,1.9是尾数,+0是指数。如果只取尾数并将其转换为整数,将尾数+指数转换为整数将变得非常简单和快速。在那之后,你应用这个符号。因此,操作变成屏蔽尾数和指数,然后进行移位,如果设置了符号位,则最后进行求反


如果他们真的选择做一个适当的四舍五入,那么他们只需要做更多的工作。该标准采用了更简单的解决方案来定义类型。

因为简单类型的行为就是这样的。你可以用代替。你应该把它们和类型转换一起舍入。次要的挑剔:要使用std::lround,你应该包括并使用正确的限定std:。Include为您提供全局命名空间中的lround。感谢您的建议。我相应地改变了答案。