我正在尝试在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";
}
}
}
}
答案 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
另一方面,函数设置全局变量是非常奇怪的,然后返回值。只是我的想法...