2012-03-07 18 views
0

なぜ結果が異なりますか? 私はfloatを使うと675を得て、もし私が二重に使うなら674 ... isnt that weird?Java DecimalFormatはfloatとdoubleで異なる結果を表示します

float f = 12345.6745; 
double d = 12345.6745; 

Locale l = Locale.forLanguageTag("es-ES"); 
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(l); 
print(df.format(f)); 
>> 12.345,675 

l = Locale.forLanguageTag("es-ES"); 
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(l); 
print(df.format(d)); 
>> 12.345,674 

おかげ

+0

'float'と' double'は同じではないためです。 ;) –

答えて

7

私が浮く使用している場合、それは、675を取得し、私は、二重使用している場合、私はその奇妙なイマイチ...、674を取得しますか?

ない、特に。異なる値を書式設定しています。特に、それは(フロート用f接尾辞)をコンパイルするように、あなたが実際にあなたのコードを変更すると仮定すると、あなたは指定 9桁の数字だにもかかわらず、floatは確実にどちらの7

を表します数字は正確には 12345.6745です。実際には、正確な値は以下のとおりです。これらの

f = 12345.6748046875 
d = 12345.674499999999170540831983089447021484375 

ルックと小数点以下第3位をdためfと4、5である理由それは明らかです。あなたは小数点以下の桁を保持したい場合は

、あなたはBigDecimalを使用して検討する必要があります。

2

問題が発生しました。これは、オーバーフローが発生したときにはっきりします。

long l = 123456789L; 
double d = l; 
float f = l; 
int i = (int) l; 
short s = (short) l; 
char ch = (char) l; 
byte b = (byte) l; 
System.out.println("l= " + l + " in hex " + Long.toHexString(l)); 
System.out.println("d= " + d); 
System.out.println("f= " + f); 
System.out.println("i= " + i + " in hex " + Integer.toHexString(i)); 
System.out.println("s= " + s + " in hex " + Integer.toHexString(s & 0xFFFF)); 
System.out.println("(int) ch= " + (int) ch + " in hex " + Integer.toHexString(ch)); 
System.out.println("b= " + b + " in hex " + Integer.toHexString(b)); 

プリント

l= 123456789in hex 112210f47de98115 
d= 1.23456789E18 
f= 1.23456794E18 
i= 2112454933 in hex 7de98115 
s= -32491 in hex 8115 
(int) ch= 33045 in hex 8115 
b= 21 in hex 15 

のみlongは(プラスのBigIntegerとBigDecimalの)他のすべてのデータタイプが異なる誤差を持ってエラーなしでこの値を表すことができます。 floatおよびdoubleが正確に最上位ビットを表し、int,short,charおよびbyteが正確に最下位ビットを表す。

関連する問題