You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何将等腰三角形内接圆面积计算代码中a、b改为int会得到Area=0?

为何将a、b改为int类型后内接圆面积计算结果为0?

核心原因:整数除法的截断特性

当你把a和b的类型从float改为int后,代码中关键的除法运算会触发整数除法规则——C++中两个整数相除时,会直接截断小数部分,只保留整数结果,这是导致最终面积为0的根本原因。

具体分析

看计算面积的核心公式:

float Area = PI * (pow(b, 2) / 4) * ((2 * a - b) / (2 * a + b));

当a和b是int时:

  1. 对于分式(2*a - b)/(2*a + b):
    根据三角形三边关系,等腰三角形的两腰a必须满足2*a > b(否则无法构成三角形),所以2*a - b是正整数,但2*a + b必然大于2*a - b(因为b是正数)。比如a=5、b=6,计算得(10-6)/(10+6)=4/16,整数除法下结果为0。
  2. 一旦这个分式结果为0,整个面积计算式就变成PI * ... * 0,最终结果自然是0。

而原来使用float类型时,所有除法都是浮点数除法,会保留小数部分,因此结果正常。

解决方法

要修复这个问题,只需确保除法运算按照浮点数规则执行,常见的两种方式:

  1. 将除法中的任意一个操作数转为浮点数:
    // 将分子转为float,触发浮点数除法
    float ratio = static_cast<float>(2*a - b) / (2*a + b);
    
  2. 使用浮点数常量代替整数常量(比如把4改成4.0f):
    float squareTerm = pow(b, 2) / 4.0f;
    

修复后的示例代码

#include <iostream>
#include <cmath> // 补充pow函数所需的头文件

using namespace std;

void ReadTriangleLegs(int& a, int& b)
{
    cout << "Please enter Triangle Leg 1 : ";
    cin >> a;
    cout << "Please enter Triangle Leg 2 : ";
    cin >> b;
}

float CalculateCircleArea(int a, int b)
{
    const float PI = 3.14159265359;
    float ratio = static_cast<float>(2*a - b) / (2*a + b);
    float Area = PI * (pow(b, 2) / 4.0f) * ratio;
    return Area;
}

void PrintResults(float Area)
{
    cout << "The Circle Area is : " << Area << endl;
}

int main()
{
    int a, b;
    ReadTriangleLegs(a, b);
    PrintResults(CalculateCircleArea(a, b));
    return 0;
}

内容的提问来源于stack exchange,提问作者Mariama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:21:38