浮点算术的最佳实践

lwx*_*ted 2 c c++ floating-point double int

我正在对小数点输入执行加法和减法,精确到小数点后第二位.我试图通过乘以100将它们转换为整数来提高准确度,但却达到了相反的效果.

请考虑以下代码和输出:

double d = 2.01;
int a = (int) (d * 100.0);
cout << a << endl;
Run Code Online (Sandbox Code Playgroud)

输出是:

200
Run Code Online (Sandbox Code Playgroud)

一劳永逸,关于浮点算术的一些最佳实践是什么?首先使用上面代码的某些变体将其转换doubleint使用然后再将它转换回来是否可行?

Jer*_*fin 6

如果打印出d*100.0(比方说)20位小数的结果,问题将很快变得明显:

200.99999999999997
Run Code Online (Sandbox Code Playgroud)

由于那个(非常精细)小于201,所以当你施展时它会被截断为200 int.

显而易见的解决方法是强制四舍五入.至少如果你的输入都是正数,那么就像在结果中加0.5一样简单:

int a = (int)(d*100.0 + 0.5);
Run Code Online (Sandbox Code Playgroud)

如果你可以指望你的编译器支持它,那么使用标准库会更容易round:

long a = lround(d*100.0);
Run Code Online (Sandbox Code Playgroud)

这适用于正数和负数.