2016-09-17 1 views
-1

Think Java(http://www.greenteapress.com/thinkapjava/thinkapjava.pdf)の23ページのエクササイズ2.3を行っています。正しいパーセンテージを計算するためにdoubleを代わずに変数をintとして表現する方法はありますか?

変数に格納されている任意の時間を秒に変換してから、その日に残っている秒数を計算し、その日のどれだけ経過したかをパーセンテージで計算します。

ここでの作業プログラムです:

public class Time { 
    public static void main(String[] args) { 

    double hour = 21.0; //Represents 9 PM 
    double minute = 5.0; //Represents 9:05 PM 
    double second = 33.0; //Represents 9:05:33 PM 

    final double SEC_IN_MIN = 60.0; //Made final because the amount of seconds in a minute does not change 
    final double SEC_IN_HOUR = 3600.0; //Made final for the same reason above. 

    final double SEC_SINCE_MN = (SEC_IN_HOUR * hour) + (SEC_IN_MIN * minute) + second; //Calculates the seconds since midnight, or 00:00 
    final double SEC_IN_DAY = 24.0 * SEC_IN_HOUR; //Calculates the amount of seconds in a day; 24 stands for the hours in a day 

    System.out.printf("The number of seconds since midnight is: %.0f\n", SEC_SINCE_MN); 
    System.out.printf("The number of seconds remaining in the day is: %.0f\n", SEC_IN_DAY - SEC_SINCE_MN); 
    System.out.printf("The percentage of the day that has passed is: %.0f%%", (100 * SEC_SINCE_MN)/SEC_IN_DAY); // Escape percent sign is %% 100 * to remove decimal value 

} 

} 

は、私は、より高度なコードとのより良い方法がある知っているが、これは割り当ては、我々がこれまでに学んだことに基づいて、必要なものです。しかし、私は倍精度浮動小数点数型をトリミングするために書式指定子を使用しなければならないので、変数を表現する最善の方法は二重であるとは思わない。私はそれについての私の教授に尋ねた、彼は私がint型との最後のprint文で計算を変更するには、すべての変数を変更することができると言いました:!

System.out.printf("The percentage of the day that has passed is: %d%%", (100 * SEC_SINCE_MN) * 1.0/SEC_IN_DAY); 

私は広告を取得するので、これは動作しません= java.lang.Doubleの最後のprintステートメントのエラー。私が1.0を1に変更した場合、最後の出力が間違っているというエラーは表示されません。

最後のprint文の出力の小数点の値が0.08788であるため、これは正しい出力である88%ではなく87%と言います。

私はそれがintで動作するように変更する必要があると思います。

doubleの代わりにintのプログラムを編集する方法はありますか?

EDIT 1:コード私の教授の提案どおりに動作しません(最後のprint文のためjava.lang.Doubleのエラーを返します)

public class Time { 

public static void main(String[] args) { 

    int hour = 21; //Represents 9 PM 
    int minute = 5; //Represents 9:05 PM 
    int second = 33; //Represents 9:05:33 PM 

    final int SEC_IN_MIN = 60; //Made final because the amount of seconds in a minute does not change 
    final int SEC_IN_HOUR = 3600; //Made final for the same reason above. 

    final int SEC_SINCE_MN = (SEC_IN_HOUR * hour) + (SEC_IN_MIN * minute) + second; //Calculates the seconds since midnight, or 00:00 
    final int SEC_IN_DAY = 24 * SEC_IN_HOUR; //Calculates the amount of seconds in a day; 24 stands for the hours in a day 

    System.out.printf("The number of seconds since midnight is: %d\n", SEC_SINCE_MN); 
    System.out.printf("The number of seconds remaining in the day is: %d\n", SEC_IN_DAY - SEC_SINCE_MN); 
    System.out.printf("The percentage of the day that has passed is: %d%%", (100 * SEC_SINCE_MN) * 1.0/SEC_IN_DAY); // Escape percent sign is %%. 100 * to remove decimal value 

} 

} 

EDIT 2:コードが、doesnの作品」 tは最後のprint文

public class Time { 

public static void main(String[] args) { 

    int hour = 21; //Represents 9 PM 
    int minute = 5; //Represents 9:05 PM 
    int second = 33; //Represents 9:05:33 PM 

    final int SEC_IN_MIN = 60; //Made final because the amount of seconds in a minute does not change 
    final int SEC_IN_HOUR = 3600; //Made final for the same reason above. 

    final int SEC_SINCE_MN = (SEC_IN_HOUR * hour) + (SEC_IN_MIN * minute) + second; //Calculates the seconds since midnight, or 00:00 
    final int SEC_IN_DAY = 24 * SEC_IN_HOUR; //Calculates the amount of seconds in a day; 24 stands for the hours in a day 

    System.out.printf("The number of seconds since midnight is: %d\n", SEC_SINCE_MN); 
    System.out.printf("The number of seconds remaining in the day is: %d\n", SEC_IN_DAY - SEC_SINCE_MN); 
    System.out.printf("The percentage of the day that has passed is: %d%%", (100 * SEC_SINCE_MN)/SEC_IN_DAY); // Escape percent sign is %%. 100 * to remove decimal value 

} 

} 

EDIT 3用に88%の正しい出力を与える:これはだまされやすい人の質問ではありません。私の質問は、倍精度からintに変数を変換する方法だったので、パーセンテージは最後のステートメントで正しく計算されました。私はそれが質問/回答に関与していましたが、丸めを求めていませんでした。

+0

だから、ダブルを丸める方法を聞いていますよね? https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#round-double- –

+0

@JB Nizet、いいえ。私のプログラムは私に正しい出力を与えます。すべての目的と目的のために、intの代わりにdouble変数を使用して割り当てを正常に完了しました。しかし、変数は代わりにintでなければなりませんが、変数がintのときに最後のステートメントを動作させる方法はわかりません。 – srocode

+0

動作しないコードを表示するのではなく、動作するコードを表示するのはどうでしょうか?起こると予想されることを正確に教えてください。代わりに何が起こりますか?しかし、 '(100 * SEC_SINCE_MN)* 1.0/SEC_IN_DAY'は二重で、丸めたいと思う。 –

答えて

-1
(100 * SEC_SINCE_MN)/SEC_IN_DAY 

は、整数100で整数SEC_SINCE_MNを乗算して、整数SEC_IN_DAYで除算されます。それは整数除算です。結果の小数部を切り捨てるだけです。

あなたが望むのは、正確なパーセンテージを小数で計算し、結果を丸めることです。したがって、浮動小数点の除算が必要です。

(100.0 * SEC_SINCE_MN)/SEC_IN_DAY 

これは、2倍の値(87。88501666666667)、次にラウンドする必要があります:

Math.round((100.0 * SEC_SINCE_MN)/SEC_IN_DAY) 
+0

ありがとうございます、これは私が探している答えを示してくれます(そして、後で非常に便利です)。しかし、私のクラスでまだカバーされていないMath.roundを使用するので、課題を満たしません。 – srocode

+0

これを別のバージョンとして追加し、Math.roundを調べると、どのように、なぜそれが動作するのか説明できます。あなたがMath.roundなしでこれを達成する方法を知っているなら、教えてください。 – srocode

+0

そして、 '%.0f %%'を保持し、 '(100.0 * SEC_SINCE_MN)/ SEC_IN_DAY'を使います。すべての計算部分は整数を使用して実行されますが、最後のものは2倍でなければなりません。それは、開発者であることの非常に非常に非常に大きな部分は、件名について何も知らないこと、学ぶための文書を読むこと、そして授業で学んだことのないことを試すことです。あなたの教師は、あなたが自律的であり、あなたがクラスで一度も見たことがないクラスを使用することができれば幸いです。 –

0

intは、ピリオドの後に来るものをスローします。あなたは10以上を複製することができます。それが5より大きいかどうか確認する最初の数字を取得してパーセントに1を加えます。 コードを書いて申し訳ありません。 私は今のiOS上だと、私のJavaのさび... 幸運

関連する問題