我正在对精确到小数点后第二位的小数输入执行加法和减法。我试图通过乘以 100 将它们转换为整数来提高准确性,但效果却相反。
考虑以下代码和输出:
double d = 2.01;
int a = (int) (d * 100.0);
cout << a << endl;
输出是:
200
总而言之,关于浮点运算的最佳实践有哪些?首先转换是否可行double
to an int
使用上面代码的某些变体,然后将其转换回来?
如果你打印出结果d*100.0
到(比如)小数点后 20 位,问题很快就会变得明显:
200.99999999999997
由于它(非常微小)小于 201,因此当您转换为时,它会被截断为 200int
.
明显的解决方法是强制舍入。至少如果您的输入都是正数,那么只需在结果中添加 0.5 即可:
int a = (int)(d*100.0 + 0.5);
如果您可以信赖您的编译器支持它,那么使用标准库的功能就更容易了round
:
long a = lround(d*100.0);
这对于正数和负数都适用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)