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

本文关键字:计算 转换 石头 很难 | 更新日期: 2023-09-27 18:00:56

#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

这是我正在使用的转换代码,目前在从石头到公斤和公斤的转换中存在问题(100 stn 0磅到公斤和磅的转换为107 stn和2.000000000000014磅(,但将100公斤转换为石头和公斤是可行的,我认为这是四舍五入的答案,但我不确定在哪里或如何解决,正在寻找一种可以处理往返转换的准确转换方法。

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

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

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

当我尝试代码时,我没有得到你说的结果:

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磅。

这完全在使用双精度数学所期望的精度范围内。

如果我可以在这里发言(对不起双关语(。。。

这实际上是两个问题。与许多学生往往难以解决的实际问题相比,代码似乎是一个微不足道的问题。这个问题是单位转换和重要数字。

根据维基百科,一块石头大约等于6.35公斤,用来测量体重。所以,如果你试图将石头转换为公斤,你需要返回6.35029*(石头的数量(,根据输入的精度四舍五入到最接近的百分之一(或千分之一(。

现在来看第二个问题,输入的精度。你似乎想对石头和磅使用整数输入,否则这样把它们分开是没有意义的。要得到十进制的石头数,你需要将整数乘以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);
}

从科学的角度来看,这将给你足够好的数字。

对于任何业务计算,最佳做法是使用精度和舍入的BigDecimal,而不是浮点或双精度。

有关float和double适用于纯数学和几何计算的详细原因,请参阅:使用JSTL/Tomcat 进行财务计算的最佳实践

一块石头重达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;
}