石头到重量的转换,难以计算出确切的公式

时间:2013-02-24 15:52:18

标签: c# converters

#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到石头和后面工作,我认为这是答案的四舍五入,但我不确定在哪里或如何解决,寻找一种方法来进行准确的转换,可以处理来往的转换。

欢迎任何其他代码绑定和建议。

(我还包括高度转换,以防出现问题)。

4 个答案:

答案 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;
}