0

なぜ結果が違うのですか?float を使用すると ,675 になり、double を使用すると ,674 になります...それは奇妙ではありませんか?

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

ありがとう

4

2 に答える 2

7

float を使用すると ,675 になり、double を使用すると ,674 になります...それは奇妙ではありませんか?

特にありません。異なる値をフォーマットしています。特に、実際にコードを変更してコンパイルできるようにすると( ffloat の接尾辞を付けて)、9 桁を指定しfloatていても、確実に 7 を表すだけです。

どちらの数値も正確に12345.6745 ではありません。実際、正確な値は次のとおりです。

f = 12345.6748046875
d = 12345.674499999999170540831983089447021484375

これらを見ると、小数第 3 位が の場合は 5、 の場合はf4 であることは明らかですd

10 進数を保持したい場合は、 の使用を検討する必要がありますBigDecimal

于 2012-03-07T11:14:12.163 に答える
2

表現に誤りがある問題。これは、オーバーフローがある場合により明白になります。

long l = 1234567890123456789L;
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= 1234567890123456789 in hex 112210f47de98115
d= 1.23456789012345677E18
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、 、shortcharおよびbyteは最下位ビットを正確に表します。

于 2012-03-07T11:23:47.937 に答える