4
public static double convertFeetandInchesToCentimeter(String feet, String inches) {
    double heightInFeet = 0;
    double heightInInches = 0;
    try {
        if (feet != null && feet.trim().length() != 0) {
            heightInFeet = Double.parseDouble(feet);
        }
        if (inches != null && inches.trim().length() != 0) {
            heightInInches = Double.parseDouble(inches);
        }
    } catch (NumberFormatException nfe) {

    }
    return (heightInFeet * 30.48) + (heightInInches * 2.54);
}

上はフィートとインチをセンチメートルに変換する関数です。下はセンチメートルをフィートとインチに戻す関数です。

public static String convertCentimeterToHeight(double d) {
    int feetPart = 0;
    int inchesPart = 0;
    if (String.valueOf(d) != null && String.valueOf(d).trim().length() != 0) {
        feetPart = (int) Math.floor((d / 2.54) / 12);
        inchesPart = (int) Math.ceil((d / 2.54) - (feetPart * 12));
    }
    return String.format("%d' %d''", feetPart, inchesPart);
}

のような通常の値を入力すると問題が発生します5 Feet and 6 Inches。完全にセンチメートルに変換され、再び 5 フィートと 6 インチに変換されます。

問題は、1 フィート 1 インチまたは 2 フィート 2 インチを変換すると、1 フィート 2 インチおよび 2 フィート 3 インチに変換されることです。

4

5 に答える 5

3

次のコードを実行しました

public class FeetInches{

    public static void main(String[] args){

        double d = convertFeetandInchesToCentimeter("1","1");

        String back_again = convertCentimeterToHeight(d);

        System.out.println(back_again);


    }

    public static double convertFeetandInchesToCentimeter(String feet, String inches) {
        double heightInFeet = 0;
        double heightInInches = 0;
        try {
        if (feet != null && feet.trim().length() != 0) {
            heightInFeet = Double.parseDouble(feet);
        }
        if (inches != null && inches.trim().length() != 0) {
            heightInInches = Double.parseDouble(inches);
        }
        } catch (NumberFormatException nfe) {

        }
        return (heightInFeet * 30.48) + (heightInInches * 2.54);
    }


    public static String convertCentimeterToHeight(double d) {
        int feetPart = 0;
        int inchesPart = 0;
        if (String.valueOf(d) != null && String.valueOf(d).trim().length() != 0) {
        feetPart = (int) Math.floor((d / 2.54) / 12);
        System.out.println((d / 2.54) - (feetPart * 12));
        inchesPart = (int) Math.ceil((d / 2.54) - (feetPart * 12));
        }
        return String.format("%d' %d''", feetPart, inchesPart);
    }


}

そして得た

1.0000000000000018
1' 2''

天井関数を使用すると、本当に 1 に切り捨てたいときに 2 に切り上げられます。

于 2013-06-12T09:44:29.777 に答える
1

問題は、Java が浮動小数点数を処理する方法が原因です。

inchesPart = (int) Math.ceil(Math.round((d / 2.54) - (feetPart * 12)));

また

inchesPart = (int) Math.floor((d / 2.54) - (feetPart * 12));

入力 2,2 の場合、inchPart の元の値は 2.0000000000000036 -> ceil ->3 です

于 2013-06-12T09:43:47.287 に答える
1

コードの主な問題は、各部分に同じ丸め関数を使用していないことです。

int feetPart = (int) Math.floor((d / 2.54) / 12);
                          ^^^^^
int inchesPart = (int) Math.ceil((d / 2.54) - (feetPart * 12));
                            ^^^^

また、一貫した結果を得るために、分解の前に丸めを行う必要があります。

int feetPart = ((int) Math.round(d / 2.54)) / 12;
int inchesPart = ((int) Math.round((d / 2.54)) - (feetPart * 12);

これは次のように因数分解できます。

int inches = (int) Math.round(d / 2.54);
int feetPart = inches / 12;
int inchesPart = inches  - (feetPart * 12);

または以来( inches - ( ( inches / 12 ) * 12) ) == ( inches % 12 )

int inches = (int) Math.round(d / 2.54);
feetPart = inches / 12;
inchesPart = inches % 12;

期待する結果に応じて、または交換することができMath.roundます。Math.floorMath.ceil

于 2013-06-12T09:49:38.680 に答える