Числа с плавающей точкой в ​​Java - PullRequest
5 голосов
/ 29 мая 2010

Может ли кто-нибудь порадовать меня, почему вывод следующей программы не "отличается от другого"?

public static void main(String[] args)
{

float f1=3.2f;
float f2=6.5f;

if(f1==3.2)
System.out.println("same");
else
System.out.println("different");

if(f2==6.5)
System.out.println("same");
else
System.out.println("different");
}

о / п: разные же

Ответы [ 6 ]

11 голосов
/ 30 мая 2010

6,5 имеет конечное двоичное представление: 110,1

Любой плавающий тип, содержащий не менее 4 значащих бит, может идеально представлять это число.

110.100000000000000000000 (с плавающей точкой)
= 6,5

110.10000000000000000000000000000000000000000000000000 (двойной)
= 6,5

3.2, с другой стороны, имеет бесконечное двоичное представление: 101.0011001100110011 ...

float и double не имеют бесконечной точности и, следовательно, могут только приближаться к этому числу: (

101.001100110011001100110 (плавание)
= 3.2000000476837158203125

101.00110011001100110011001100110011001100110011001101 (двойной)
= 3.20000000000000017763568394002504646778106689453125

Как вы можете ясно видеть, эти цифры не совпадают!

5 голосов
/ 29 мая 2010

Поскольку 3.2 не представляется точно так же, как число с плавающей запятой, а 6.5 - (подсказка: 6.5 = 13 * 2 ^ (- 1)), а также тот факт, что 3.2 является литералом double, а 3.2f является float буквальный.

3 голосов
/ 29 мая 2010

Поскольку 3.2f является значением float, а 3.2 является значением double. Числа с плавающей запятой всегда немного неточны, потому что двоичное представление не может их точно реализовать, поэтому сравнивать их для точного равенства - плохая идея. Особенно , сравнивая поплавки с двойными. Такие выражения, как 3.2f == 3.2f, обычно нормальные, но даже в некоторых языках они могут потерпеть неудачу, например если они представляют числа в регистрах более точно, чем в памяти.

1 голос
/ 29 мая 2010

Это может помочь понять

0 голосов
/ 29 мая 2010

Кроме того, я думаю, что все с десятичными десятичными значениями по умолчанию удваивается, поэтому, когда вы делаете сравнение, вы должны также добавить 'f', например if(f2==6.4f).

0 голосов
/ 29 мая 2010

«3.2f» относится к типу float. «3.2» относится к типу double.

...