14

Java での次のステートメントを見てみましょう。

System.out.println(new DecimalFormat("0").format(2.4)); //returns 2

System.out.println(new DecimalFormat("0").format(2.5)); //returns 2  <---Concentrate here
System.out.println(Math.round(2.5));                    //returns 3

System.out.println(new DecimalFormat("0").format(2.6)); //returns 3
System.out.println(new DecimalFormat("0").format(3.5)); //returns 4

上記のステートメントでは、次の場合を除き、他のすべてのケースは自明です。

System.out.println(new DecimalFormat("0").format(2.5));

返すべきなの3に返してしまう2。どのように?

4

2 に答える 2

21

のデフォルトの丸めモードはDecimalFormatですRoundingMode.HALF_EVEN。これは、数値が次の隣に近い場合は切り上げ、または切り捨てを行うことを意味します。数値が 2 つの隣人 (この場合は 2 と 3) の間にある場合、最も近い偶数 (この場合は 2) に丸められます。

ご覧のとおり、3.5 で試してみると、4 に丸められました。

より「直観的な」動作が必要な場合は、「スクールハウスの丸め」として知られ、子供たちに教えられることが多いため、 を使用しますRoundingMode.HALF_UP

setRoundingMode(RoundingMode.HALF_UP)

数値がちょうど 2 つの隣人の間にある場合は、HALF_UP常に切り上げられます。

于 2012-04-13T16:27:53.750 に答える
16

これは意図的な動作です。ドキュメントから:

丸め

DecimalFormat は、書式設定に半偶数丸め (ROUND_HALF_EVEN を参照) を使用します。

ROUND_HALF_EVENについて:

両方の隣接点が等距離でない限り、「最も近い隣接点」に向かって丸める丸めモード。その場合は、偶数の隣接点に向かって丸めます。破棄された端数の左側の桁が奇数の場合、ROUND_HALF_UP と同じように動作します。偶数の場合は ROUND_HALF_DOWN と同じように動作します。これは、一連の計算に繰り返し適用されたときに累積誤差を最小化する丸めモードであることに注意してください。

これは、バンカーの丸めとしても知られています。

Math.Round一方、「通常の」丸めである次の式を使用します。

(long)Math.floor(a + 0.5d)
于 2012-04-13T16:27:26.213 に答える