2015-01-10 7 views
6

ハーフ偶数丸めでは、四捨五入している数値が隣り合う辺の間で等距離にある場合(例えば、小数点以下で四捨五入する場合は4.5)、前の数値を丸めます最も近い偶数に設定します。ハーフ偶数丸め

たとえば、 の小数点以下を四捨五入すると、1.5,3.5,5.5,7.5,9.5の各数値はそれぞれ2,4,6,8,10に切り上げられます。これはネットビーンズでうまくいっていますが、小数点以下1桁に丸めると問題に遭遇しています。

package foo; 
import java.text.NumberFormat; 

public class Foo { 
    public static void main(String[] args) { 
     NumberFormat formatter = NumberFormat.getNumberInstance();  
     formatter.setMaximumFractionDigits(1); 
     System.out.print(formatter.format(4.45)); 
    } 
} 

実行:

4.5 

BUILD SUCCESSFUL (total time: 0 seconds) 

私は、これは私がフォーマットへの入力のための4.55を使用する場合はさらに、4.5私は4.6 はあり期待出力である4.4

に丸めると思うだろうJavaまたは私の理解との間違い?

+0

を試みるが、NumberFormatを半でも、デフォルトではありますか?[/ s]の用事あなたは確かであるが、それはあります。 – Arhowk

+0

私はあなたのコードを実行し、それは私に与えた4.4 – Arhowk

+0

私は4.4を得ています。どのJavaのバージョンを使用していますか? –

答えて

4

これは実際には技術的にバグであるとは確信していません。いくつかの精度に、2のべき乗の倍数の和:

問題は、4.45を書いて、値がdoubleとして解釈されている場合、それはバイナリ画分に丸められていることです。 (すなわち、それ自体がHALF_EVENは、代わり桁のバイナリ桁で丸めを用いて行われる丸め。)の値がわずかに上またはわずかに4.45未満でよい丸め、しかしNumberFormatは、二重に格納されている真のバイナリ値を丸めないであろう

あなたが書いた小数値。

あなたは、私が最も近い0.1に丸めされている実際の値である、私は4.45000000000000017763568394002504646778106689453125を取得し、それを行うときに、あなたが実際にSystem.out.println(new BigDecimal(4.45));を書くことで取得している真のバイナリ値を決定することができます - 間違い4.5になるだろう。

1

それは整数に丸め、[S]この

formatter.setMaximumFractionDigits(0); 
    System.out.println(formatter.format(4.5)); 
    System.out.println(formatter.format(5.5)); 

出力

4 
6