JavaRush /Java Blog /Random-JA /Java での数値の丸め

Java での数値の丸め

Random-JA グループに公開済み
浮動小数点数 (float、double) は、10 進精度が必要な式を計算するときに使用されます。会計やその他のコンピューティング操作では、多くの場合、高い精度が必要とされます。 Java での数値の丸め - 1しかし、小数点の後の数値の長い「尾部」が常に必要なのでしょうか? おそらく 3 実数部の精度があれば十分なのではないでしょうか? このオプションには満足していますが、丸めを適切に実行するにはどうすればよいでしょうか? これはまさに今日私たちが話す内容です。Javaで数値を丸める方法を見ていきます。

文字列形式

最初の方法として、double の丸めを見ていきます。
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
その結果、浮動小数点数 34766674 を小数点以下 3 桁の精度でフォーマットします。これは、フォーマット手順で小数点以下 3 桁「%.3f」を指定したためです。また、文字列をフォーマットするときの %f は浮動小数点のタイプを示します。これには、Java のデータ型doublefloat が含まれます。上の例では、結果の値をコンソールに出力しています。問題は、これをどのように短縮できるかということです。簡単です。printf を使用する必要があります。は format + print です。その結果、前の例は次のように簡略化されます。
double value = 34.766674;
System.out.printf("%.3f",value);
このメソッドに加えて、 PrintStreamクラス の out インスタンスにも format メソッドがあり、これは同様に機能します。
double value = 34.766674;
System.out.format("%.3f",value);
HALF_UP モードでは、切り捨てられる数値に近い数値 (0 または 10) に丸めが行われます。これらの数値が等しい場合 (5 の場合)、切り上げが実行されます。例:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
丸めモードについては、以下で詳しく説明します。 Java での数値の丸め - 2

10 進形式

もう 1 つのオプションは、 DecimalFormatクラスを使用することです。これは、整数であっても浮動小数点数であっても、Java で任意の数値をフォーマットするように設計されています。DecimalFormatをインスタンス化するときにフォーマット文字列を渡すことができます。入力をフォーマットする小数点以下の桁数が示されます。DecimalFormat を使用した例は次のようになります。
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### 行は、渡された値を小数点以下 3 桁にフォーマットすることを示すパターンです。DecimalFormat オブジェクトの作成後にパターンを変更するには、そのapplyPatternメソッドとapplyLocalizedPatternメソッドを使用できます。
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
でも今日は丸めの話ですよね?指定されたパターンを超えて小数点以下の桁で数値を切り捨てる場合、DecimalFormat は、切り捨てられた最後の数値が 5 より大きい場合に数値を切り上げます。しかし、数値が 5 の場合はどうなるでしょうか。これは、最も近い整数のちょうど中間にあることがわかります。じゃあ何?この場合、前の数値が考慮されます。偶数の場合、四捨五入が行われます。
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
奇数の場合は実行されません。
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
String.format() を使用した浮動小数点数のフォーマットと DecimalFormat.format() にはわずかな違いがあります。最初のものは、小数部がない場合でも常に末尾のゼロを出力します。例えば:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
ご覧のとおり、数値 7.000132 を小数点以下 3 桁にフォーマットすると、String の format() メソッドは 7.000 を出力し、DecimalFormat の format() メソッドは 7 を出力します。つまり、String.format()またはDecimalFormat を選択できます。 )末尾のゼロが必要かどうかに応じて異なります。上記のメソッドを使用すると、結果を文字列の形式で受け取りました。正確な数値を取得する方法を見てみましょう。

数学

数値を使ったさまざまな算術演算に合わせた特別なクラス、Mathについて言及することはできません。 Java での数値の丸め - 3このクラスには四捨五入のメソッドもありますが、すでに説明したものとは異なり、特定の小数点以下の桁数を設定することはできず、整数に丸めることができます。
  • Math.ceil() は最も近い整数に切り上げますが、整数型ではなく double を返します。

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    34.0000000 があったとしても、Math.ceil を使用すると35.0 が得られます。

    Math.floor() は最も近い整数に切り捨て、結果を double として返します。

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    繰り返しますが、値が 34.999999999 であっても、Math.floorを使用すると34.0 が得られます。

  • Math.round () - 最も近い整数に丸め、結果は int になります。

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    数値が 34.5 の場合、数値は 35 に四捨五入されますが、34.499 よりわずかに小さい場合、数値は 34 に切り捨てられます。

    単純に実部全体を切り捨てるのではなく、この処理を小数点以下の桁数に制限し、同時に四捨五入するために、数値に 10^n (10 の n 乗) を掛けます。ここで、n必要な小数点以下の桁数に等しい。この後、 Mathクラスのメソッドを使用して四捨五入し、再度 10^n で除算します。

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - 2 つの引数を取ります。1 つ目は数値、2 つ目は上げる必要がある累乗です。

BigDecimal による丸め

BigDecimal は、浮動小数点数を操作できるようにするクラスです。特に、任意の長さの小数を格納できる(つまり、数値の範囲に制限がない)ことが大きな特徴です。また、このクラスには四捨五入などの演算処理の各種メソッドが格納されています。このオブジェクトのクラスは、コンストラクターを double、浮動小数点数を表示する string、double とMathContextなどを設定することによって作成できます。 MathContext は、RoundingModeと、検索値の合計桁数を表す数値の組み合わせです。丸めルール RoundingMode: DOWN - ゼロに向かって丸めます。 UP - ゼロからの丸めモード。 CEILING - 正の無限大に向かって丸めます。 FLOOR - 負の無限大に向かって丸めます。 HALF_UP - 両方の近傍が等距離でない場合 (つまり、四捨五入される数値が 5 の場合)、「最近傍」に丸めます。この場合、切り上げが行われます。 HALF_DOWN - 「最近傍」に向かって丸めます。両方の隣接点が等距離でない場合、この場合は切り捨てられます。 HALF_EVEN - 両方の隣接要素が等距離でない場合、「最も近い隣接要素」に丸められます。この場合、偶数の近傍に丸めます (上記の DecimalFormat と同様)。 UNNECESSARY - 要求された操作の結果が正しいことを確認するために使用されます。したがって、四捨五入は必要ありません。例:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
BigDecimal では 、コンストラクターで丸めルールを設定する機能に加えて、インスタンスの作成後に丸めモードを設定することもできます。これを行うには、setScaleメソッドを使用します。このメソッドでは、小数点以下の桁数と丸め規則を設定する必要があります。
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal には、丸めモード ( ROUND_DOWNROUND_CEILINGROUND_FLOOR ...)を設定するために設計された内部int変数 もあります。これらは、 RoundingModeクラスで提示されるものと同様の丸めルールであり、 setScaleでも同様に使用されます。
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
BigDecimal クラスの詳細については、この記事を参照してください。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION