在C++中将double转换为int而不会出现舍入错误

use*_*460 7 c++ double int casting

我有以下代码投入doubleint:

double dblValue = 7.30;
int intValue = (int)(dblValue*100);  //I want intValue to store extactly 730;
cout << intValue;
Run Code Online (Sandbox Code Playgroud)

输出: 729

I know that the compiler is reading dblValue as 7.2999999 before casting it to int.
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否可以通过防止舍入错误将其强制转换为730?

如果您的解决方案避免使用C++ 11或其他预定义函数,那将是最好的.我在这里使用的唯一预处理器指令是<iostream>.

gha*_*.st 19

将非整数(在数学意义上)的数字转换为整数时,无法阻止舍入错误,您唯一能做的就是尝试实现正确的舍入.

实现合理(尽管不完美)舍入的最简单方法如下:

int intValue = (int)(dblValue < 0 ? dblValue - 0.5 : dblValue + 0.5);
Run Code Online (Sandbox Code Playgroud)

当然,既然你的问题都被标记了c++,casting我无法抗拒用c ++风格的演员代替你的c风格演员:

int intValue = static_cast<int>(dblValue < 0 ? dblValue - 0.5 : dblValue + 0.5);
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`std :: round`(如果适合将结果转换为`int`)? (2认同)

Hol*_*Cat 0

这不是任何类型的错误,而是计算机存储浮点值的方式。你可以这样做:

int intValue = (int)(dblValue*100 + 0.00001);
Run Code Online (Sandbox Code Playgroud)