-1
#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.00000000000014 磅)但将 100 公斤转换为石头并返回工作,我认为它是四舍五入答案,但我不确定在哪里或如何修复,寻找一种方法来进行准确的转换,可以处理往返的转换。

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

(我包括了高度转换,以防万一也有问题)。

4

4 回答 4

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

这完全在您使用双精度数学可以预期的精度范围内。

于 2013-02-24T16:06:02.070 回答
1

如果我可以在这里称重(对不起双关语)......

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

根据维基百科,一块石头大约等于 6.35 公斤,用于测量体重。因此,如果您尝试将石头转换为公斤,则需要返回 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);
}

从科学的角度来看,这将为您提供足够好的数字。

于 2013-02-24T17:02:11.147 回答
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;
}
于 2013-02-24T16:32:21.933 回答
0

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

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

于 2013-02-24T15:55:25.343 回答