为何含floor函数的代码输出科学计数法,移除后输出整数?
问题背景与解答
问题描述
提交以下第一段代码时,当输入数值较大,输出会呈现科学计数法;但移除floor函数后的第二段代码却能输出整数形式,请问这是为什么?此外,我认为代码中ld ac = (v[i] + v[j]) / 2;的运算为long long类型的整数运算,不存在浮点数运算,这与ChatGPT的解释不符,对此也有疑问。
第一段代码
void solve() { ll n; cin >> n; vector <ll> v(n); ld sum = 0; ld mx = 0; for(int i = 0; i < n; i++) { cin >> v[i]; } while (v.size() > 1) { sort(v.begin(), v.end()); int i = 0, j = 1; ld ac = (v[i] + v[j]) / 2; sum += v[i] + v[j]; v.erase(v.begin() + j); v.erase(v.begin() + i); v.push_back(ac); } cout << floor(v[0]) << "\n"; }
第二段代码
void solve() { ll n; cin >> n; vector <ll> v(n); ld mx = 0; for(int i = 0; i < n; i++) { cin >> v[i]; } while (v.size() > 1) { sort(v.begin(), v.end()); int i = 0, j = 1; ld ac = (v[i] + v[j]) / 2; v.erase(v.begin() + j); v.erase(v.begin() + i); v.push_back(ac); } cout <<v[0] << "\n"; }
解答
1. 输出格式差异的原因
floor函数的返回值是long double浮点类型,C++的cout在输出浮点数值时,当数值绝对值超出特定范围(通常是≥1e16或≤1e-4),会自动切换为科学计数法格式,哪怕该浮点值实际是整数。- 直接输出
v[0]时,尽管它也是long double类型,但由于你的运算逻辑最终得到的是整数数值,cout会自动识别并以十进制整数形式输出,不会触发科学计数法。
2. 运算类型的说明
你的理解完全正确,ld ac = (v[i] + v[j]) / 2;中的核心运算属于long long整数运算,不存在浮点除法:
v[i]和v[j]都是long long类型,二者相加结果仍为long long;- 除数
2是int类型,运算时会被自动提升为long long,因此(v[i]+v[j])/2执行的是整数除法(直接舍去小数部分); - 最终只是将整数除法得到的
long long结果,隐式转换为long double类型后赋值给ac。
ChatGPT的解释存在错误,这行代码的除法过程本身是整数运算,仅在赋值阶段才转为浮点类型。
内容的提问来源于stack exchange,提问作者Maruf Islam
相关产品推荐
相关产品推荐

