#region Weights
private double StoneToKg(double Stone, double pounds)
{
return (Stone * 14 + pounds) * 0.4535970244035199;
}
private double[] KgToStone(double p)
{
double T = (p * 0.1574714285714286);
double Stn = Math.Floor(T);
double Pounds = (T - Stn) * 14;
return new double[2] { Stn, Pounds };
}
#endregion
#region Heights
private double CmToM(double Cm)
{
return Cm * 0.01;
}
private double MToCm(double M)
{
return M * 100;
}
private double FeetToMeters(double Feet, double inch)
{
Feet *= 12;
return (Feet + inch) * 0.025399999961392;
}
private double[] MetersToFeet(double Meters)
{
double feet = Math.Floor(Meters * 3.2808399);
double inch = (Meters * 3.2808399) - Math.Floor(Meters * 3.2808399);
inch *= 12;
return new double[2] { feet, inch };
}
private double feetInchToCentimeters(double feet, double inch)
{
return MToCm(FeetToMeters(feet, inch));
}
private double[] CentimetersToFeetInch(double Cm)
{
return MetersToFeet(CmToM(Cm));
}
#endregion
这是我正在使用的转换代码,目前有问题从石头转换为kg并返回(100 stn 0磅到kg并且返回给出107 stn和2.00000000000014磅)但是转换100 kg到石头和后面工作,我认为这是答案的四舍五入,但我不确定在哪里或如何解决,寻找一种方法来进行准确的转换,可以处理来往的转换。
欢迎任何其他代码绑定和建议。
(我还包括高度转换,以防出现问题)。
答案 0 :(得分:2)
当我尝试代码时,我没有得到你说的结果:
double kg = StoneToKg(100, 0);
Console.WriteLine(kg);
double[] st = KgToStone(kg);
Console.WriteLine(st[0]);
Console.WriteLine(st[1]);
输出:
635,035834164928
100
1,98951966012828E-13
这不是107颗宝石和2磅,即100颗宝石和0.0000000000002磅。
这完全符合您使用双精度数学所期望的精度。
答案 1 :(得分:1)
如果我可能在这里称重(对不起双关语)......
这实际上是两个问题。与真正的问题相比,代码似乎是一个微不足道的问题,许多学生往往会挣扎。这个问题是单位转换和重要数字。
据维基百科称,Stone相当于约6.35千克,用于测量体重。因此,如果您尝试将石头转换为kg,则需要返回6.35029 *(#ofStones),舍入到最接近的百分位数(或千分之一),具体取决于输入的精度。
现在谈到第二个问题,输入的精确度。看起来你会想要使用整数输入来计算石头和磅数,否则将它们分开是没有意义的。要获得十进制数的石头,您需要将整数乘以14,然后加上磅,然后将整数除以14并乘以6.35029:
[(intStones * 14) + pounds]/14 * 6.35029
- >舍入到最接近的百分之
这有意义吗?那么对于你的转换回来,我建议使用如下整数(注意整数除法和乘法规则自动截断小数):
public void KgToStoneAndPounds(double kg, out int stones, out int pounds)
{
//Convert kg to lbs (keep sig fig rules, I always go one extra place in intermediate calculations)
double totalPounds = Math.Round(kg * 2.20462, 3);
stones = totalPounds / 14;
pounds = Math.Round(totalPounds - (stones * 14), 0);
}
从科学的角度来看,这将为你提供足够多的数字。
答案 2 :(得分:0)
对于任何业务计算,最佳做法是使用BigDecimal进行精确和舍入,而不是浮点数或双精度。
有关float和double适用于纯数学和几何计算的详细原因,请参阅:Best Practice for financial calculations using JSTL/Tomcat
答案 3 :(得分:0)
一块石头为6.35029千克,每块石头有14磅。所以...
const double KgPerStone = 6.35029;
const double PoundsPerStone = 14;
public double StonesToKg(double stones, double pounds)
{
double totalStone = stones + (pounds / PoundsPerStone);
return totalStone * KgPerStone;
}
public double KgToStones(double kg, out pounds)
{
double totalStone = kg / KgPerStone;
double stone = Math.Truncate(totalStone)
double frac = totalStone - Math.Truncate(stone);
pounds = frac * PoundsPerStone;
return stone;
}