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

基于电压计算功率/电流的工具开发问题:双向计算功能异常

功率/电流双向计算工具问题

我正在开发一款工具,可根据给定的电压(Voltage)计算所需的功率(Watts)或电流(Amps),需求如下:

  • 输入电压与电流时,自动计算功率
  • 输入电压与功率时,自动计算电流
  • 修改功率或电流数值后,点击计算按钮可重新触发对应计算

目前单独注释掉功率或电流的计算代码时,对应功能能正常运行,但无法同时实现双向计算。以下是存在问题的代码片段:

int Amperage = 0;
int Voltage = 0;
int Wattage = 0;
int TotalNeed = 0;
    
private void Form1_Load(object sender, EventArgs e)
{
    TxtWattage.MaxLength = 16;
    TxtAmperage.MaxLength = 16;
    TxtVoltage.MaxLength = 16;
    TxtVoltage.Text = "0";
    TxtAmperage.Text = "0";
    TxtWattage.Text = "0";
    Amperage = Convert.ToInt16(TxtAmperage.Text);
    Wattage = Convert.ToInt16(TxtWattage.Text);
    Voltage = Convert.ToInt16(TxtVoltage.Text);     
}
    
private void BtnCalculate_Click(object sender, EventArgs e)
{
    Amperage = Convert.ToInt16(TxtAmperage.Text);
    Wattage =  Convert.ToInt16(TxtWattage.Text);
    Voltage = 12;

    // this is where I am stuck. I can get either one to work if I comment out the other one. 
    //I want to be able to change either the wattage or amperage and then click the button to calculate the other one.

    // Calculate wattage
 if(TxtWattage.Text == "")
 {      
 Wattage = Voltage * Amperage;           
 TxtWattage.Text = Wattage.ToString();
 }
 
else if(TxtAmperage.Text == "")
{   
// Calculate amperage
Amperage = Wattage / Voltage;
TxtAmperage.Text = Amperage.ToString();
}
}

问题根源

  1. 判断逻辑失效:仅通过文本框是否为空来决定计算方向,但用户修改数值后文本框不会为空,导致后续计算无法触发
  2. 电压值被硬编码:代码里强制把Voltage设为12,直接忽略了用户在文本框中输入的电压值
  3. 整数精度丢失:用int类型存储数值会导致除法运算丢失小数精度(比如13W/12V的实际电流是1.08A,但整数除法会得到1A)
  4. 无输入验证:直接用Convert.ToInt16转换用户输入,若用户输入非数字会直接报错

修复后的代码

// 改用double存储数值,保留小数精度
double Amperage = 0;
double Voltage = 0;
double Wattage = 0;
int TotalNeed = 0;
    
private void Form1_Load(object sender, EventArgs e)
{
    TxtWattage.MaxLength = 16;
    TxtAmperage.MaxLength = 16;
    TxtVoltage.MaxLength = 16;
    TxtVoltage.Text = "0";
    TxtAmperage.Text = "0";
    TxtWattage.Text = "0";
}
    
private void BtnCalculate_Click(object sender, EventArgs e)
{
    // 先验证并读取输入值,避免转换失败报错
    if (!double.TryParse(TxtVoltage.Text, out Voltage))
    {
        MessageBox.Show("请输入有效的电压值");
        return;
    }
    // 电压不能为0,避免除法错误
    if (Voltage == 0)
    {
        MessageBox.Show("电压不能为0");
        return;
    }

    double inputAmps = 0;
    double inputWatts = 0;
    bool hasAmps = double.TryParse(TxtAmperage.Text, out inputAmps);
    bool hasWatts = double.TryParse(TxtWattage.Text, out inputWatts);

    // 逻辑:如果有电流和电压,计算功率
    if (hasAmps && !hasWatts)
    {
        Wattage = Voltage * inputAmps;
        TxtWattage.Text = Wattage.ToString("F2"); // 保留两位小数
    }
    // 如果有功率和电压,计算电流
    else if (hasWatts && !hasAmps)
    {
        Amperage = inputWatts / Voltage;
        TxtAmperage.Text = Amperage.ToString("F2");
    }
    // 处理用户同时输入了电流和功率的情况
    else if (hasAmps && hasWatts)
    {
        MessageBox.Show("请只输入电流或功率中的一项,另一项留空");
    }
    else
    {
        MessageBox.Show("请输入电压,以及电流或功率中的一项");
    }
}

关键修改说明

  • 将数值类型从int改为double,保留小数精度,避免计算误差
  • 使用double.TryParse做输入验证,防止非数字输入导致程序崩溃
  • 取消电压硬编码,读取用户输入的电压值,并添加电压不能为0的判断
  • 调整计算逻辑:通过判断用户是否输入了电流/功率来决定计算方向,而非依赖文本框为空
  • 用ToString("F2")格式化输出,保留两位小数,结果更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:22:37