二次方程求解:如何用整数运算得到保留两位小数的双精度浮点数结果?
解决整数参数下二次方程浮点结果的问题
问题核心出在整数除法的截断特性:C++中两个整数相除时,会自动舍弃小数部分只保留整数商。比如你的代码里k/a是5/3,结果是1而非预期的1.666...,导致sqrt(1)得到1,最终计算结果不符合要求。
要在保留a、h、k整数类型的前提下解决问题,只需让除法运算转为浮点运算,以下是几种可行方案:
方案1:显式转换其中一个操作数为double
通过static_cast<double>将整数转为双精度浮点数,触发浮点除法逻辑:
x1 = -h + sqrt(static_cast<double>(k)/a);
也可以用C风格强制转换:
x1 = -h + sqrt((double)k/a);
方案2:用1.0参与运算触发类型提升
给其中一个整数乘以1.0(双精度常量),让整个除法表达式的运算类型自动提升为double:
x1 = -h + sqrt(k*1.0/a);
修改后的完整代码
#include <iostream> #include <cmath> #include <typeinfo> #include <iomanip> #include <string> using namespace std; int main( ) { int a = 3, h = 4, k = 5 ; double x1; // 改为浮点除法运算 x1 = -h + sqrt(static_cast<double>(k)/a); x1 = round(x1*100.0)/100.0; cout << "The solutions for the equation are: " << endl << " " << "x1: " << setprecision(2) << fixed << x1; }
运行这段代码后,k/a会计算为1.666...,sqrt得到约1.291,最终x1结果为-2.71,既满足保留两位小数的双精度要求,又全程保留了a、h、k的整数类型。
内容的提问来源于stack exchange,提问作者David Garza
相关产品推荐
相关产品推荐

