В чем разница между float и double в Java?
Какая еще есть разница между типами данных float и double или я что-то в упор не вижу?
Отслеживать
14.2k 1 1 золотой знак 21 21 серебряный знак 31 31 бронзовый знак
задан 18 июл 2017 в 21:19
Yuri Migushin Yuri Migushin
61 1 1 серебряный знак 7 7 бронзовых знаков
Вставляйте код прямо в сообщение (в виде кода), а не ссылайтесь на внешние ресурсы. Сообщения должны быть самодостаточными, ссылки могут служить только дополнением.
18 июл 2017 в 22:46
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Принципиальный нюанс здесь в том, что вы оперируете десятичными числами, а float и double — бинарные. Те числа, которые вы делите и получаете в результате, непредставимы в бинарной системе счисления без периодичных дробей. Подробнее:
То, что вы наблюдаете — это не округления и обрубания, а попытки компьютера впихать невпихуемое и сделать вид, что на самом деле всё в порядке. Так как количество битов у мантиссы и экспоненты типов float и double разная, то «округления» и «обрубания» будут происходить с вашей точки зрения «непредсказуемо». Эта ситуация усугубляется ещё и тем, что точность вычислений на совести процессора, который, вообще говоря, не обязан выдавать точность до последнего знака. На другом компьютере вы можете увидеть другие результаты — если не включите специальный «предсказуемый» режим, который медленнее. Но даже в этом случае вы получите только одинаковые, но «непредсказуемые» результаты на разных компьютерах.
Когда работаете с float и double, примите как данность, что они всегда с погрешностью.
В чем разница между float и double?
Я знаю, что я читал о различии между двойной точностью и одинарной точностью и т.д. Но они должны давать одинаковые результаты в большинстве случаев правильно? Я решал проблему на конкурсе программирования, и были вычисления с числами с плавающей запятой, которые были не очень большими, поэтому я решил использовать float вместо double, и я проверил его — я получил правильные результаты. Но когда я отправляю решение, он сказал, что только 1 из 10 тестов были правильными. Я проверил снова и снова, пока не обнаружил, что использование float не совпадает с использованием double. Я поместил double для вычислений и удвоил для вывода, и программа дала результаты SAME, но на этот раз правильно провела все 10 тестов. Повторяю, результат был SAME, результаты были одинаковыми, но при этом float не работал — только удвоить. Значения не были слишком большими, и программа дала те же результаты в тех же тестах как с float, так и с двойным, но онлайн-судья принял только решение с двойным предоставлением. Почему? В чем разница?
VaioIsBorn 05 март 2010, в 13:20
Поделиться
Поделиться:
floating-point
double-precision
11 ответов
Лучший ответ
Огромная разница. Как следует из названия, double имеет 2x точность float [1] . В общем случае double имеет 15 десятичных цифр точности, а float — 7. Здесь вычисляется количество цифр:
double имеет 52 бит мантиссы + 1 скрытый бит: log (2 53 ) ÷ log (10) = 15,95 цифр float имеет 23 бит мантиссы + 1 скрытый бит: log (2 24 ) ÷ log (10) = 7,2 цифры
Эта прецизионная потеря может привести к значительному уменьшению ошибок усечения, например,
float a = 1.f / 81; float b = 0; for (int i = 0; i < 729; ++ i) b += a; printf("%.7g\n", b); // prints 9.000023
double a = 1.0 / 81; double b = 0; for (int i = 0; i < 729; ++ i) b += a; printf("%.15g\n", b); // prints 8.99999999999996
Кроме того, максимальное значение float составляет около 3e38 , но double около 1.7e308 , поэтому использование float может привести к бесконечности намного проще, чем удвоить для чего-то простого, например. вычисление 60 факториалов. Возможно, их тестовый пример содержит эти огромные числа, которые заставляют вашу программу терпеть неудачу. Конечно, иногда даже double недостаточно точен, поэтому мы иногда имеем long double [1] (приведенный выше пример дает 9.000000000000000066 на Mac), но все типы с плавающей запятой страдают от ошибки округления, поэтому, если точность очень важна (например, обработка денег), вы должны использовать int или класс фракций. BTW, не используйте += , чтобы суммировать много чисел с плавающей запятой, поскольку ошибки накапливаются быстро. Если вы используете Python, используйте fsum . В противном случае попробуйте выполнить алгоритм суммирования Kahan. [1]: стандарты C и С++ не определяют представление float , double и long double . Возможно, что все три реализованы как двойная точность IEEE. Тем не менее, для большинства архитектур (gcc, MSVC; x86, x64, ARM) float действительно является номером с плавающей точкой с одиночной точностью IEEE (двоичный файл32), а double является числом с плавающей точкой с двойной точностью IEEE (двоичный код64).
В чем разница int, long и float, double?
Начинаю учить Java и сразу споткнулся.
Желательно чтобы прям на пальцах разжевали.
Вот есть типы данных int и flow - все понятно: целые и дробные. Но в Java есть еще какие-то double и long.
Из прочитанного нагугления - ниасилил; только 32бит и 64.
Числа в hex и пр передаются и пишутся в коде? Или о чем и куда это вообще.
З.Ы.
Извините за глупый вопрос, но. Лучше спросить и показаться глупым, чем не спросить и таким остаться.
З.З.Ы.
Возможно кто-то заинтересуется взять в ученики, что было бы просто замечательно.
- Вопрос задан более трёх лет назад
- 11734 просмотра
3 комментария
Простой 3 комментария
Сергей Горностаев @sergey-gornostaev Куратор тега Java
Начинаю учить Java и сразу споткнулся.
Попробуйте учить по учебнику.
Александр Степанов @Exebeche Автор вопроса
Сергей Горностаев, спасибо за совет, но.
Уже доказано временем, что этот вариант для меня не подходит.
Если честно, даже сам, не верю, что у меня начало получаться программирование.
При моей "невосприимчивости" приходится на полную использовать настойчивость и пр. не очень хорошие методы; но на php и yii2 я уже могу сделать сайты различной сложности, но без фанатизма и в определенных рамках, которые я все теми же путями пытаюсь расширить..
З.Ы.
Если будет интересно и время могу без купюр рассказать о себе и как. Лет 15 назад я начал предпринимать попытки научиться программированию и верстке.
А на данный момент у меня есть (, пока что,) из того что можно показать - https://manufacture17.com.ua
А остальное даже показывать не стоит; научился не смотря ни на что и буду дальше пытаться.

Александр Степанов @Exebeche Автор вопроса
DarthWazer, не совсем готовым. Просто почитав материалы и пройдя уроки (SoloLearn) по/про PHP у меня осталось больше вопросов чем я получил ответов - самое яркое было про использование бд.
Ну такая вот у меня голова деревянная по-пояс.
А на фреймворке я учился написанию кода, созданию классов, взаимодействию между объектами, построению логики, построению архитектуры бд. Даже нашел в свободном доступе курс Дмитрия Елисеева по применению ООП на yii2 (очень ему признателен за такой курс и очень сожалею, что не имею возможности с ним за него расплатиться, но. кое что таки понял, хотя прям совсем чуть-чуть. (и оч надеюсь, что у меня появится возможность с Дмитрием рассчитаться, хоть и с запозданием))
Учить собираюсь упорно и настойчиво; читать/смотреть доступные материалы и перечитывать/пересматривать пытаясь вникнуть, понять и осознать. искать ответы на возникающие вопросы, а так же понять найденные ответы (благо есть Гулюгулю, стаковерфлоу и данный сайт, а так же уже заданные и отвеченные вопросы и люди, которые могут себе позволить дать ответ таким тяжелым "горе программистам")) как я.
Всю свою историю становления "программистом" могу, при Ваших желании и интересе, рассказать в личной переписке, а в кратце - лет 15 назад я начал предпринимать попытки создания сайтов (верстка и пр.), года 3-4 как "с остервенелостью" начал долбиться о "гранитик науки" PHP; для таких сроков результаты "с гулькин нос" и я это вполне осознаю, но. кое-что все-таки получается и я уже не совсем бесполезный член общества; многое еще нужно понять, разобрать, усвоить и т.д. и я не оставляю попыток (тем более, что хоть и с трудом и на грани безумия, но мне удалось сдвинуть этот "гранит" с мертвой точки, а значит есть некоторые шансы сдвинуть и еще).
Было бы чудесно найти учителя, который мог бы взять меня "подмастерьем" т.е. чтобы я расплачивался своими уже имеющимися скилами и какую-то копейку выделять мне за проделанную мной рабоу "на нужды", ну или хоть совсем без копеек, но все же делиться знаниями и разжевывать те моменты, которые я совсем никак, но, пока такого человека не нашел и приходится - как есть.
Кое что, даже интуитивно удается понять, но о многом приходится задавать вопросы разной степени глупости, увы
Difference Between float and double
Key Difference – float vs double
In programming, it is required to store data. The data is stored in memory. Memory locations that store data are called variables. Each memory location can store a specific type of data. Memory size for each data type is different. In programming languages such as Python, the programmer does not need to declare the type of the variable. In programming languages such as Java, the programmer should declare the variable type. There is a number of data types such as char, int, float and double. The char data type is used to store a single character value. The int data type is used to store numeric values without decimal points. The float and double data types are used to store numerical values with decimal points. This article discusses the difference between float and double. The key difference between float and double is that float is a single precision 32 bit IEEE 754 floating point data type while double is a double precision 64 bit IEEE 754 floating point data type.
CONTENTS
What is float?
The float is a single precision 32-bit floating point. It is predefined data type supported by programming languages such as Java. To declare a float variable, the keyword ‘float’ is used. So it cannot be used for identifier names such as method names and variable names. Refer the below program.

Figure 01: Java Program with float Data Type
According to the above program, the number is a variable that can store a floating point number. Here, -20.5f is used instead of the -20.5. -20.5 is a double literal. To indicate the compiler to store the value as a float, the programmer should write f or F.
What is double?
The double is a double precision 64-bit floating point. It is a predefined data type. To declare a double variable, the keyword ‘double’ is used. Therefore, it cannot be used for identifier names such as method names and variable names. Refer the below program.

Figure 02: Java Program with double Data Type
According to the above program, the number is a variable of type double. Printing the number will give the output as -20.5. It takes 64 bits in the memory to store the value. If the programmer is written -20.5, it is considered as a double. He can also write it as -20.5d. Writing ‘d’ is optional.
Type casting can be performed on data types. It is the process of converting a one data type to another data type. When assigning a smaller data type to a larger data type, there is no casting required. The widening occurs in a byte, short, int, long, float, double order. When assigning a larger data type to a small data type, it is necessary to do the casting.

Figure 03: Casting
According to the above program, num1 and num2 have float data types. The summation is assigned to the variable sum. It is a float. As float is a smaller data type comparing to double, it can be directly assigned to the double variable number without a type casting.
The x and y can store double data types. The summation is assigned to the variable z. It can also store double. Type casting is required to assign a larger data type to a smaller data type. Therefore, to store the double value to a float variable, it is necessary to do type casting because double is a larger data type than float.
What are the Similarities Between float and double?
- Both float and double are predefined data types supported by programming languages such as Java.
- Both float and double types are not used for precisions such as currency.
What is the Difference Between float and double?
float vs double
Summary – float vs double
In programming, it is necessary to store data. Those data are stored in memory locations and called variables. Each variable stores data of specific type. There are data types such as int, char, double and float etc. This article discussed the difference between two data types that are a float and double. The difference between float and double is that float is a data type, which is a single precision 32 bit IEEE 754 floating point while double is a data type, which is a double precision 64 bit IEEE 754 floating point.
Reference:
1. Java Variables and (Primitive) Data Types. Available here
2.Point, Tutorials. “Java Basic Datatypes.”, Tutorials Point, 8 Jan. 2018. Available here
