-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

これは私が使用している変換コードです。現在、石からkgへの変換とその逆の変換に問題があります(100 stn 0ポンドからkgへの変換は107 stnと2.00000000000014ポンドを返します)が、100 kgから石への変換と元への変換は機能します。丸めだと思います答えはありますが、どこをどのように修正すればよいかわかりません。変換を処理できる正確な変換を行う方法を探しています。

ただし、他のコードの結び付けや提案は大歓迎です。

(それにも問題がある場合に備えて、高さの変換を含めました)。

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

私がここで検討することができれば(ダジャレで申し訳ありません)...

これは実際には 2 つの問題です。コードは、多くの学生が苦労する傾向がある実際の問題と比較して、些細な問題のように見えます。その問題は、単位換算と有効数字です。

ウィキペディアによると、石は約 6.35 kg に相当し、体重を測定するために使用されます。したがって、石を kg に変換しようとしている場合は、入力の精度に応じて、最も近い 100 分の 1 (または 1000 分の 1) に丸められた 6.35029 * (#ofStones) を返す必要があります。

次に、2 番目の問題である入力の精度について説明します。石とポンドに整数入力を使用したいようです。そうしないと、それらをそのように分離しても意味がありません。石の 10 進数を取得するには、整数に 14 を掛けてからポンドを足し、全体を 14 で割り、6.35029 を掛ける必要があります。

[(intStones * 14) + pounds]/14 * 6.35029 --> 100 分の 1 に丸める

これは理にかなっていますか?次に、元に戻すには、次のように整数を使用することをお勧めします (整数の除算と乗算の規則では、小数が自動的に切り捨てられることに注意してください)。

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

ビジネス計算の場合、ベストプラクティスは、floatまたはdoubleの代わりに、精度と丸めを使用してBigDecimalを使用することです。

floatとdoubleが純粋に数学および幾何学的計算に適している理由の詳細については、JSTL/Tomcatを使用した財務計算のベストプラクティスを参照してください。

于 2013-02-24T15:55:25.343 に答える
0

1 石は 6.35029 kg で、1 石あたり 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 に答える