方法在C#中返回零

时间:2013-08-27 15:56:50

标签: c# windows-phone

我正在尝试在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";
                }
        }
    }
}

6 个答案:

答案 0 :(得分:4)

问题在于您在此行中执行整数除法:

((bodyFatPercentage / 100) * bodyWeight);

因为(bodyFatPercentage / 100)小于1,它会自动截断为0,因此整个函数返回0.

您可以改为使用:

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

替代方案包括

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

或简单地返回一个浮点值。

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

答案 1 :(得分:2)

可能您的值太小,结果类似于0.something,而int无法保存包含值的.(十进制),因此它会将值四舍五入为 ZERO < / strong>即可。我建议您使用double返回值。

答案 2 :(得分:2)

其他人确实为您提供了铸造浮动或双重编程解决方案,但是您的三年级数学课程还有另一种解决方案。乘法和除法是可传递的。

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

现在通过乘以第一个得到大于100的数字并且没有得到截断问题,一旦你除去它仍然会给你正确的百分比值。

答案 3 :(得分:1)

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

如果你的结果是int类型,你可能需要将结果或{$ 1}}转换回int。

答案 4 :(得分: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);
        }
    }
}

答案 5 :(得分:0)

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

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

试试这个:

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

基本上,bodyFatPercentage / 100始终会导致0.xx(数学上),但因为您使用int类型(不支持小数位),它会将值舍入到0。通过使用100f代替,您将其中一个类型声明为float(它支持小数位),因此结果将保持小数精度(0.xx),然后将乘以{{1并且再次产生一个浮点值(保持小数位),最后你的整体结果可以转换回bodyWeight。这将再次进行,但到那时您将获得更准确的结果,例如int - &gt; (int)63.22


另一方面,函数设置全局变量是非常奇怪的,然后返回值。只是我的想法...