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