2016-05-19 5 views
2

Когда я пытаюсь разобрать следующую строку в число с плавающей точкой и в двойной:Строка плавать/двойной Синтаксический

String abc = "8.40"; 
System.out.println("Double Value: " + Double.parseDouble(abc) * 100); 
System.out.println("Float Value: " + Float.parseFloat(abc) * 100); 

Я получаю два разных результата.

Double Value: 840.0 
Float Value: 839.99994 

Но когда я пытаюсь тот же код с умножением поплавок и дважды на 10 или 1000 я получаю аналогичные результаты для обоих из них.

String abc = "8.40"; 
System.out.println("Double Value: " + Double.parseDouble(abc) * 10); 
System.out.println("Float Value: " + Float.parseFloat(abc) * 10); 

Получаю два похожих результата.

Double Value: 84.0 
Float Value: 84.0 

И когда я пытаюсь это:

String abc = "8.40"; 
System.out.println("Double Value: " + Double.parseDouble(abc) * 1000); 
System.out.println("Float Value: " + Float.parseFloat(abc) * 1000); 

я получаю два аналогичных результатов.

Double Value: 8400.0 
Float Value: 8400.0 
+4

ОК. Какой вопрос? 'Float' имеет меньшую точность, чем' Double'. – Vyacheslav

+0

То же самое происходит при использовании '' 'System.out.println (« Float Value: »+ Float.parseFloat (« 8.40f ») * 100);' ''? – m4mbax

ответ

3

Это будет работать нормально:

System.out.println("Float Value: "+Math.round((float)Float.parseFloat(abc)*100)); 

Таким образом, это происходит из-за различного представления double и float, или точнее, о IEEE-754 для округления float. Читайте об этом here.

float имеет меньший диапазон и точность, поэтому double будет лучше, если у вас есть память (которую вы делаете сегодня). Но они оба злые! В Java есть лучший вариант: BigDecimal, и вы должны его использовать, так как у него нет проблем с размером, и сегодня у нас есть сильные компьютеры, поэтому у нас не будет проблем с памятью и скоростью при работе с большим количеством десятичных чисел, требующих максимальная точность. Например, если вы работаете над программным обеспечением, которое занимается большими денежными транзакциями, его необходимо использовать BigDecimal.

+0

BigDecimal, float и double имеют хорошие возможности. Я видел ситуации, в которых каждый из них намного лучше, чем любой из двух других. Всегда использовать BigDecimal так же серьезно, как всегда, используя одну из двух других. –

+0

@PatriciaShanahan Использование только сегодня Я могу представить себе некоторые микропроцессоры с некоторыми быстрыми датчиками, поэтому обработка BigDecimal займет слишком много времени из-за непараллельной обработки и медленного процессора. Большинство проектов на основе SE и EE будут обрабатывать большое количество BigDecimals в менее 1 мс, поэтому не должно возникать проблем со скоростью.Даже память должна быть в порядке, так как для крупных проектов на основе EE вы можете позволить себе достаточно ОЗУ, а Java 8 отлично справляется с этим (работает с одним из таких проектов на основе SE, обрабатывает идеальный размер кеша 30 + GB, и я всегда использовал Integer, Long, Double , BigDecimal и т. Д. - используется Long даже в качестве идентификаторов) –

+0

Вы, кажется, думаете с точки зрения принятия проблем с размерами, которые могут быть решены на старых компьютерах, и считая, что все текущие компьютеры должны запускаться. Я просто возьму одно поле. Много лет назад я увидел презентацию вычислительного химика. У него была диаграмма с логарифмическими шкалами операций с плавающей запятой в секунду на одной оси, размер памяти - с другой, с проблемами, с которыми он работал бы с учетом этих ресурсов. График расширился по сравнению с текущей производительностью и памятью. –

2

Это правда, что double имеет большую точность, чем float, но оба они страдают от той же проблемы: их значение не может быть точным, и они оба имеют некоторую (небольшую) округление ошибка в их наименее значащий бит (LSB) , Это ясно в первом полученном вами результате: float Значение неточно. Но когда вы умножаетесь на 10 или 1000, LSB отбрасывается из результата, поэтому вы получаете правильный ответ как для float, так и для double.

+0

Хороший инструмент, который показывает проблему, таков: http://www.h-schmidt.net/FloatConverter/IEEE754.html – Alexander

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