C# C语言中返回零的方法

C# C语言中返回零的方法,c#,windows-phone,C#,Windows Phone,我试图用C语言编写一个简单的计算器,用户输入他们的体重和体脂百分比,程序告诉他们他们的瘦体重。调试时,似乎总是说他们的瘦体重与体重相同,这让我相信getBodyfatAmount返回0 namespace Fitness_Calcualtors { public partial class Lean_Body_Mass : PhoneApplicationPage { int bodyWeight, bodyFatPercentage, leanBodyMass,

我试图用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";
                }
        }
    }
}

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

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

您可以改为使用:

(int)((bodyFatPercentage / 100.0) * bodyWeight);
替代方案包括

(int)Math.Round((bodyFatPercentage / 100.0) * bodyWeight);
bodyFatPercentage * bodyWeight / 100
或者只是返回一个浮点值


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

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

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

您可以改为使用:

(int)((bodyFatPercentage / 100.0) * bodyWeight);
替代方案包括

(int)Math.Round((bodyFatPercentage / 100.0) * bodyWeight);
bodyFatPercentage * bodyWeight / 100
或者只是返回一个浮点值


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

可能您的值太小,结果类似于0.something,int无法保存。包含值的十进制数将值舍入为零。我建议您使用double来返回值。

可能您的值太小,结果类似于0.something,int不能保留。包含值的decimal将值舍入为零。我建议您使用double返回值。

假设bodyFatPercentage是一个介于0和100之间的值, bodyFatPercentage/100将返回0。为什么? 因为你在除整数。 将代码更改为使用双值,您就走上了正确的轨道。 双体脂肪百分比/100


如果结果为int类型,则可能需要强制转换或更好的数学运算。将结果取整回int。

假设bodyFatPercentage是一个介于0和100之间的值, bodyFatPercentage/100将返回0。为什么? 因为你在除整数。 将代码更改为使用双值,您就走上了正确的轨道。 双体脂肪百分比/100


如果结果的类型为int,则可能需要强制转换或更好的数学运算。将结果取整回int。

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

然而,我认为问题是由于四舍五入造成的。使用除法时,最好使用支持小数点的类型

试试这个:

bodyFatAmount = (int)((bodyFatPercentage / 100f) * bodyWeight);
基本上,bodyFatPercentage/100在数学上总是会得到0.xx,但是因为您使用的int类型不支持小数点,所以它会将值四舍五入到0。如果改用100f,您将其中一种类型声明为float,该类型不支持小数点,因此结果将保持小数点精度0.xx,然后乘以体重,再次得到保持小数点的float值,最后您的总体结果可以转换回int。这将再次进行四舍五入,但到那时,您将获得更准确的结果,例如,int63.22->63


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

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

然而,我认为问题是由于四舍五入造成的。使用除法时,最好使用支持小数点的类型

试试这个:

bodyFatAmount = (int)((bodyFatPercentage / 100f) * bodyWeight);
基本上,bodyFatPercentage/100在数学上总是会得到0.xx,但是因为您使用的int类型不支持小数点,所以它会将值四舍五入到0。如果改用100f,您将其中一种类型声明为float,该类型不支持小数点,因此结果将保持小数点精度0.xx,然后乘以体重,再次得到保持小数点的float值,最后您的总体结果可以转换回int。这将再次进行四舍五入,但到那时,您将获得更准确的结果,例如,int63.22->63


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

其他人都会先给你一个浮点或双精度的编程解决方案,但是你三年级数学课上还有另一个解决方案。乘法和除法是传递的

bodyFatAmount = ((bodyFatPercentage * bodyWeight) / 100);
现在先乘以,得到一个大于100的数字,而不存在截断问题,
一旦你除以它,它仍然会给你正确的百分比值。

其他所有人都会先给你一个浮点或双精度的编程解决方案,但是你三年级数学课上还有另一个解决方案。乘法和除法是传递的

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

现在,先相乘得到一个大于100的数字,但没有得到截断问题,一旦除以它,仍然会得到正确的百分比值。

尝试下面的修改,您的问题与使用整数执行非整数数学有关。我还整理了一些代码,使其更具可读性,更接近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);
        }
    }
}

尝试下面的修改,您的问题与使用整数执行非整数数学有关。我还整理了一些代码,使其更具可读性,更接近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);
        }
    }
}

当GoBODYFATORATION返回0时,BoyHealthTestBox和BoyftAtExtBox中输入的值是什么?你应该考虑这些因素:It体重、体脂百分比、瘦体重、体脂肪量;Double而不是intsMy猜测是因为除以一个可能小于100的int,当它截断小数点时,留下0。试着改变所有的变量,当GoBODYFATORATION返回0时,在BoyHealthTestBox和BoyftAtExtBox中输入的值是什么?你应该考虑一下:It BooDoad,BooFrutal%,LeaByMysas,BoyFrimeToint;Double而不是intsMy猜测是因为除以一个可能小于100的int,当它截断小数点时,留下0。尝试将所有变量更改为double这可能没有帮助,因为左侧类型决定运算符IIRC的类型。该方法返回int,尽管您关于整数除法的观点是正确的,但这不会解决问题,该方法的返回类型应为支持浮点数的类型。否,将执行加宽转换。左边的类型并不能决定它,是什么决定了它是哪个类型保存了更多的数据。@Habib它会解决这个问题,因为他之后会乘以体重。整数截断仍然会发生,但是对于我假设的是他想要的地方,而不是在进程中间丢失数据。这可能没有帮助,因为左边类型决定了操作符Irc的类型。方法是返回int,虽然你关于整数除法的点是正确的,但是这不会解决问题。方法的返回类型应为支持浮点数的类型。否,将执行加宽转换。左边的类型并不能决定它,是什么决定了它是哪个类型保存了更多的数据。@Habib它会解决这个问题,因为他之后会乘以体重。整数截断仍然会发生,但我假设他想要的地方,而不是在进程中间丢失数据。有用提示:在方法上设置断点,单击左边的栏或按F9,并将鼠标悬停在变量上。您也可以选择整个表达式并将鼠标悬停或按SHIFT+F9键查看其值。有用提示:在方法上设置断点单击左栏或按F9键并将鼠标悬停在变量上。也可以选择整个表达式并悬停或按SHIFT+F9键查看其值。