2015-07-06 4 views
0

Все целые литералы рассматриваются как int в java, а литералы с плавающей точкой рассматриваются как double в java. Тогда почемуПотеря точности в java

byte b =10; 

не дает какой-либо ошибки, но

float f = 10.0; 

дает потерю точности ошибки, когда в обоих случаях вниз литья происходит?

+0

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

Возможный дубликат [Что такое float в Java?] (Http://stackoverflow.com/questions/ 5076710/what-is-float-in-java) – JavaHopper

+0

Обратите внимание, что с суффиксом 'f' вы получаете литерал' float', а не букву 'double' ... и с суффиксом' L', вы получаете 'long', а не буква' int'. Итак, ваше первое предложение немного слишком велико. –

ответ

4

В случае int к byte, нет никакой реальной заботы о потере точности , потому что оба типа имеет одинаковую степень детализации. Вы получите ошибку, если попытаетесь преобразовать литерал со значением вне диапазона от byte до byte. (Сообщение об ошибке дается в том случае, немного вводит в заблуждение.)

В случае double к float, вы можете иметь постоянное значение, которое находится в диапазоне право , но по-прежнему теряют точность. В вашем конкретном случае 10.0 значение может быть представлено точно как в float, так и в double, но в общем случае это не так.

В качестве примера того, считают это:

float f = (float) 10.1; // Or float f = 10.1f; 
double d = 10.1; 
System.out.println(f == d); // Prints false 

Это потому, что точность теряется в переходе от double к float - ни один из типов может представлять 10.1 точно, но double приближается к нему, чем float делает , Оператор == будет означать, что f преобразуется обратно в double, с другим значением до d.

+0

Удивительное объяснение сэр !! Я никогда не ожидал, что 10.1 (float) равняется 10.1 (double) как false (после преобразования типа) – JavaHopper

Смежные вопросы