1

我正在尝试用 C# 编写一个简单的计算器,用户输入他们的体重和体脂百分比,程序会告诉他们他们的瘦体重。在调试时,似乎总是说他们的瘦体重与他们的体重相同导致我相信 getBodyfatAmount 返回 0。

namespace Fitness_Calcualtors
{
    public partial class Lean_Body_Mass : PhoneApplicationPage
    {
        int bodyWeight, bodyFatPercentage, leanBodyMass, bodyFatAmount;

        public Lean_Body_Mass()
        {
            InitializeComponent();
        }

        private int getBodyfatAmount()
        {
            bodyFatAmount = ((bodyFatPercentage / 100) * bodyWeight);
            return bodyFatAmount;
        }

        private void convertInput()
        {
            bodyWeight = Convert.ToInt32(bodyweightTextBox.Text);
            bodyFatPercentage = Convert.ToInt32(bodyFatTextBox.Text);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
                if (kilogramsRadioButton.IsChecked ==true)
                {
                    convertInput();
                    getBodyfatAmount();

                    leanBodyMass = (bodyWeight - bodyFatAmount);
                    resultTextBox.Text = leanBodyMass.ToString() + " Kilos";
                }
                else if (poundsRadioButton.IsChecked == true)
                {
                    convertInput();
                    getBodyfatAmount();

                    leanBodyMass = (bodyWeight - bodyFatAmount);
                    resultTextBox.Text = leanBodyMass.ToString() + " Lbs";
                }
        }
    }
}
4

6 回答 6

4

问题是您在这一行中执行整数除法:

((bodyFatPercentage / 100) * bodyWeight);

因为 (bodyFatPercentage / 100) 小于 1,所以会自动截断为 0,所以整个函数返回 0。

您可以改为使用:

(int)((bodyFatPercentage / 100.0) * bodyWeight);

替代方案包括

(int)Math.Round((bodyFatPercentage / 100.0) * bodyWeight);
bodyFatPercentage * bodyWeight / 100

或者只是返回一个浮点值。

就个人而言,我会返回一个浮点值。作为一般的经验法则,在您需要显示它之前不要放弃精度(如果您想要一个不太精确的显示)。否则,您可能会得到复合舍入误差,这基本上就是这里发生的情况。

于 2013-08-27T16:00:29.450 回答
2

其他人确实为您提供了先转换为浮点数或双精度数的编程解决方案,但是您的三年级数学课还有另一种解决方案。乘法和除法是传递的。

bodyFatAmount = ((bodyFatPercentage * bodyWeight) / 100);

现在通过先相乘,您会得到一个大于 100 的数字,并且不会出现截断问题,一旦除以它仍然会给您正确的百分比值。

于 2013-08-27T16:05:13.487 回答
2

可能您的值太小,结果类似于0.something,并且int不能保存.(十进制)包含值,因此它将值四舍五入为零。我建议你使用double返回值。

于 2013-08-27T16:01:20.433 回答
1

假设,bodyFatPercentage 是一个介于 0 和 100 之间的值, (bodyFatPercentage / 100)将返回 0。为什么?因为你正在划分整数。更改您的代码以使用双精度值,您就走在了正确的轨道上。 ((double)bodyFatPercentage / 100)

如果您的结果是 int 类型,您可能必须将结果强制转换为或更好地Math.Round返回 int。

于 2013-08-27T16:01:55.347 回答
1

尝试以下修改,您的问题与使用整数执行非整数数学有关。我还整理了一些代码,使其更具可读性并更接近 Microsoft 编码标准,删除了过多的括号,删除了过多的私有变量等:

public partial class LeanBodyMass : PhoneApplicationPage
{
    private decimal bodyWeight;
    private decimal bodyFatPercentage;

    public LeanBodyMass()
    {
        InitializeComponent();
    }

    private decimal GetBodyFatAmount()
    {
        return bodyFatPercentage / 100m * bodyWeight;
    }

    private void ConvertInput()
    {
        bodyWeight = Convert.Decimal(bodyweightTextBox.Text);
        bodyFatPercentage = Convert.Decimal(bodyFatTextBox.Text);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.ConvertInput();
        this.GetBodyFatAmount();

        decimal leanBodyMass = bodyWeight - bodyFatAmount;

        if (kilogramsRadioButton.IsChecked ==true)
        {
            resultTextBox.Text = string.Format("{0} Kilos", leanBodyMass);
        }
        else if (poundsRadioButton.IsChecked == true)
        {
            resultTextBox.Text = string.Format("{0} Lbs", leanBodyMass);
        }
    }
}
于 2013-08-27T16:11:17.487 回答
0

首先,您应该使用调试器单步执行以确认问题的确切来源。

但是,我预计问题是由于四舍五入造成的。使用除法时,最好使用支持小数位的类型。

尝试这个:

bodyFatAmount = (int)((bodyFatPercentage / 100f) * bodyWeight);

基本上,bodyFatPercentage / 100总是会导致0.xx(数学上),但是因为您使用的是int类型(不支持小数位),它会将值四舍五入为0. 通过使用100f,您将其中一种类型声明为浮点数(支持小数位),因此结果将保持小数精度(0.xx),然后将其乘以bodyWeight并再次产生浮点值(保持小数位),最后,您的整体结果可以重新转换为int. 这将再次进行一轮,但到那时您将获得更准确的结果,例如,(int)63.22->63


顺便说一句,函数设置像这样的全局变量,然后也返回值是很奇怪的。只是我的想法想法...

于 2013-08-27T16:01:59.247 回答