study in 洛谷(隐式转换)(2025.11.18)

B2029 大象喝水 - 洛谷

//一升=1000cm立方
//一毫升=1cm立方
//数据都是整数

#include <iostream>
using namespace std;
int main()
{   int h,r;
    cin>>h>>r;

    int v;
    v=3.14*r*r*h;
    int quantity;
    quantity=20*1000/v+1;

    cout<<quantity;


    return 0;
}
/*#include<bits/stdc++.h>
using namespace std;
int h,r,a;
int main(){
	cin>>h>>r;
	a=20000/(3.14*r*r*h)+1;
	cout<<a;
	return 0;
}*/

为什么下面的代码对上面的错

为什么会截断不是会隐式转换吗

### 数据类型转换规则:隐式转换与显式截断的区别  

#### 一、`int v = 3.14 * r * r * h` 为什么会截断?  
- **右侧计算结果是浮点数**:  
  `3.14` 是 `double` 类型,`r` 和 `h` 是 `int` 类型。根据 C++ 隐式转换规则,`int` 会先转换为 `double`,参与运算后结果为 `double`(如 `3.14*11*11*23 ≈ 8738.62`)。  

- **左侧变量类型是 `int`**:  
  当把 `double` 类型的结果赋值给 `int` 类型变量时,**不会进行四舍五入,而是直接截断小数部分**(显式截断)。例如:  
  `double result = 8738.62; int v = result;` → `v` 的值为 `8738`(丢失 `0.62`)。  


#### 二、“隐式转换”为何没生效?  
隐式转换仅发生在 **运算过程中**,而 **赋值时的类型不匹配会触发截断**:  
- **运算阶段**:`r` 和 `h` 会隐式转换为 `double`,确保 `3.14*r*r*h` 的计算精度(正确)。  
- **赋值阶段**:`double` 结果赋值给 `int v` 时,C++ 规定 **不允许隐式转换为更“窄”的类型**(`double` → `int` 可能丢失精度),必须显式截断(直接丢弃小数)。  


#### 三、下方代码为何避免了截断?  
下方代码 **未使用 `int` 中间变量**,直接在表达式中完成浮点数除法:  
```cpp  
a = 20000 / (3.14 * r * r * h) + 1;  
```  
- **计算过程**:  
  `3.14*r*r*h` 结果为 `double`(如 `8738.62`),`20000` 隐式转换为 `double`,除法结果为 `double`(如 `20000/8738.62≈2.288`)。  
- **整数除法规则**:  
  当 `double` 结果赋值给 `int a` 时,同样会截断小数部分(`2.288` → `2`),但因 **未提前截断体积 `v`**,保留了原始精度,最终 `+1` 后结果正确。  


#### 四、总结:关键区别  
| 场景                | 上方代码(`int v`)               | 下方代码(直接计算)           |  
|---------------------|-----------------------------------|--------------------------------|  
| **体积计算精度**    | `double` 结果被截断为 `int`       | 保留 `double` 精度             |  
| **对最终结果影响**  | 可能因截断导致体积偏小,桶数偏多   | 体积精度完整,桶数计算准确      |  

**核心结论**:截断发生在 **赋值给 `int` 变量时**,而非运算阶段。下方代码通过 **直接使用浮点数运算结果**,避免了中间截断,因此结果正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值