Перейти к содержимому

Int и double в чем разница

  • автор:

В чем разница int, long и float, double?

Начинаю учить Java и сразу споткнулся.
Желательно чтобы прям на пальцах разжевали.
Вот есть типы данных int и flow — все понятно: целые и дробные. Но в Java есть еще какие-то double и long.
Из прочитанного нагугления — ниасилил; только 32бит и 64.
Числа в hex и пр передаются и пишутся в коде? Или о чем и куда это вообще.
З.Ы.
Извините за глупый вопрос, но. Лучше спросить и показаться глупым, чем не спросить и таким остаться.
З.З.Ы.
Возможно кто-то заинтересуется взять в ученики, что было бы просто замечательно.

  • Вопрос задан более трёх лет назад
  • 11902 просмотра

3 комментария

Простой 3 комментария

Сергей Горностаев @sergey-gornostaev Куратор тега Java

Начинаю учить Java и сразу споткнулся.

Попробуйте учить по учебнику.

Exebeche

Александр Степанов @Exebeche Автор вопроса

Сергей Горностаев, спасибо за совет, но.
Уже доказано временем, что этот вариант для меня не подходит.
Если честно, даже сам, не верю, что у меня начало получаться программирование.
При моей «невосприимчивости» приходится на полную использовать настойчивость и пр. не очень хорошие методы; но на php и yii2 я уже могу сделать сайты различной сложности, но без фанатизма и в определенных рамках, которые я все теми же путями пытаюсь расширить..
З.Ы.
Если будет интересно и время могу без купюр рассказать о себе и как. Лет 15 назад я начал предпринимать попытки научиться программированию и верстке.
А на данный момент у меня есть (, пока что,) из того что можно показать — https://manufacture17.com.ua
А остальное даже показывать не стоит; научился не смотря ни на что и буду дальше пытаться.

Exebeche

Александр Степанов @Exebeche Автор вопроса

DarthWazer, не совсем готовым. Просто почитав материалы и пройдя уроки (SoloLearn) по/про PHP у меня осталось больше вопросов чем я получил ответов — самое яркое было про использование бд.
Ну такая вот у меня голова деревянная по-пояс.
А на фреймворке я учился написанию кода, созданию классов, взаимодействию между объектами, построению логики, построению архитектуры бд. Даже нашел в свободном доступе курс Дмитрия Елисеева по применению ООП на yii2 (очень ему признателен за такой курс и очень сожалею, что не имею возможности с ним за него расплатиться, но. кое что таки понял, хотя прям совсем чуть-чуть. (и оч надеюсь, что у меня появится возможность с Дмитрием рассчитаться, хоть и с запозданием))
Учить собираюсь упорно и настойчиво; читать/смотреть доступные материалы и перечитывать/пересматривать пытаясь вникнуть, понять и осознать. искать ответы на возникающие вопросы, а так же понять найденные ответы (благо есть Гулюгулю, стаковерфлоу и данный сайт, а так же уже заданные и отвеченные вопросы и люди, которые могут себе позволить дать ответ таким тяжелым «горе программистам»)) как я.
Всю свою историю становления «программистом» могу, при Ваших желании и интересе, рассказать в личной переписке, а в кратце — лет 15 назад я начал предпринимать попытки создания сайтов (верстка и пр.), года 3-4 как «с остервенелостью» начал долбиться о «гранитик науки» PHP; для таких сроков результаты «с гулькин нос» и я это вполне осознаю, но. кое-что все-таки получается и я уже не совсем бесполезный член общества; многое еще нужно понять, разобрать, усвоить и т.д. и я не оставляю попыток (тем более, что хоть и с трудом и на грани безумия, но мне удалось сдвинуть этот «гранит» с мертвой точки, а значит есть некоторые шансы сдвинуть и еще).
Было бы чудесно найти учителя, который мог бы взять меня «подмастерьем» т.е. чтобы я расплачивался своими уже имеющимися скилами и какую-то копейку выделять мне за проделанную мной рабоу «на нужды», ну или хоть совсем без копеек, но все же делиться знаниями и разжевывать те моменты, которые я совсем никак, но, пока такого человека не нашел и приходится — как есть.
Кое что, даже интуитивно удается понять, но о многом приходится задавать вопросы разной степени глупости, увы

Какой лучший способ сравнить Double и Int?

Вы действительно не можете сравнить с плавающей точкой и интегральные значения наивным образом; в частности, поскольку существуют классические с плавающей точкой проблемы с представлением. То, что вы можете сделать, это вычесть одно из другого и посмотреть, не меньше ли разница между ними, например:

int iValue = 0; double dValue = 0.0; var diff = Math.Abs(dvalue - iValue); if( diff < 0.0000001 ) // need some min threshold to compare floating points return true; // items equal 

Вам действительно нужно определить, что означает equality для вас. Например, вы можете захотеть, чтобы значение с плавающей запятой округлялось к ближайшему целому числу, так что 3.999999981 будет "равно" равным 4. Или вы можете усечь значение, поэтому оно будет эффективно равным 3. Все зависит от того, что вы "пытаюсь добиться".

EDIT: Обратите внимание, что я выбрал 0,0000001 в качестве примерного порогового значения. вам нужно решить, какая точность достаточна для сравнения. Просто убедитесь, что вы должны находиться в пределах нормальных репрезентативных границ double , которые, как мне кажется, определены как Double.Espilon .

LBushkin 30 окт. 2009, в 16:19
Поделиться

Это хорошее решение проблемы, о которой я говорил. Для большей точности (только когда это необходимо) используйте только целые числа, как я предложил в своем ответе.

San Jacinto 30 окт. 2009, в 14:30

Не лучше ли сравнить системную константу epsilon (см. Здесь msdn.microsoft.com/en-us/library/system.double.epsilon.aspx ) вместо жестко заданного значения, например 0,0000001? NB Я никогда не кодировал C # (только C ++), но я предполагаю, что применяется тот же принцип

pxb 30 окт. 2009, в 14:35

Я упоминаю об этом в редактировании моего ответа. Эпсилон может или не может быть хорошим выбором, в зависимости от того, какую точность заботит ОП в своем коде.

LBushkin 30 окт. 2009, в 14:37

Double.Epsilon полезен только в том случае, если вы вычитаете значения между 0 и 1, поскольку это «наименьшее положительное значение Double больше нуля». Поскольку double значения не распределены равномерно, а их расстояние увеличивается с их величиной, вы никогда не получите что-то вокруг Double.Epsilon, если вычтете два значения.

Joey 30 окт. 2009, в 14:37

@Johannes: Йоханнес: Это хороший момент. Для очень больших положительных / отрицательных значений код должен быть более «расслабленным» в том, как он оценивает равенство.

LBushkin 30 окт. 2009, в 14:39

@johannes Я понимаю, что ты делаешь в паре. Однако это делает константу 0,0000001 в равной степени неподходящей, поскольку она также будет страдать от той же проблемы. Какое решение? Если разница
pxb 30 окт. 2009, в 14:41

pxb: Это не совсем просто, и одна из моих главных претензий по поводу assertEqual(double, double, double) JUnit assertEqual(double, double, double) которая страдает точно такой же проблемой. Однажды я написал вспомогательный метод, который посмотрел на аргументы и определил правильный x в 10 ^ * x *, чтобы они были равны заданному числу мест. Хотя не очень. Но да, вы правы, эта проблема всегда остается. Я просто хотел указать, что Double.Epsilon потерпит неудачу почти в каждом случае, в то время как другие могут быть полезны в Double.Epsilon случаев.

Joey 30 окт. 2009, в 14:45
Показать ещё 5 комментариев

Это очень плохая идея сравнить целые числа и числа с плавающей запятой для равенства на любом языке. Он работает для очень простых случаев, но после того, как вы вообще делаете какую-либо математику, вероятность того, что программа сделает то, что вы хотите, резко уменьшится.

Это связано с тем, как числа с плавающей запятой хранятся в двоичной цифровой системе.

Если вы уверены, что хотите использовать это, создайте класс, чтобы сделать свой собственный номер с дробями. используйте один int для поддержания целого числа, а другой int - для сохранения фракции.

San Jacinto 30 окт. 2009, в 15:45
Поделиться

double val1 = 0; double val2 = 0.0; if((val1 - Double.Epsilon) < 0) < // Put your code here >OR if((val2 - Double.Epsilon) < 0) < // Put your code here >

где Double.Epsilon - это самое низкое возможное значение для Double.

Jatin 25 июнь 2012, в 13:19
Поделиться
Читатели, см. Комментарий Джои под основным вопросом.
person27 28 авг. 2018, в 06:50

Это действительно зависит от того, что вы считаете "равным". Если вы хотите, чтобы ваше сравнение возвращало true тогда и только тогда, когда double точно соответствует целочисленному значению (т.е. Не имеет дробного компонента), вы должны сделать свой int двойным, чтобы выполнить сравнение:

bool isEqual = (double)iValue == dValue; 

Если что-то вроде 1.1 будет считаться равным 1, вы можете либо перевести double в int (если вы хотите вообще игнорировать дробный компонент), либо вокруг двойника, если вы хотите сказать 1.9 равным 2.

Ryan Brunner 30 окт. 2009, в 16:03
Поделиться
Осторожнее с округлением. Многие люди кажутся удивленными, когда 2,5 раунда до 2.
Joey 30 окт. 2009, в 14:31

@Joey Довольно просто написать свой собственный код округления, чтобы получить желаемое поведение, если три встроенных не соответствуют вашим потребностям.

Casey 12 янв. 2015, в 18:57

В настоящее время почти единственный раз, когда нужно сравнивать значения типов double и либо integer , либо long для строгого равенства, когда по какой-то причине один задерживает сохранение или передачу интегральных величин как плавающих, и позже необходимо их вернуть. Такое преобразование в большинстве случаев может быть легко достигнуто путем литья интегрального типа до double , а затем сравнения результата этого литья. Обратите внимание, что преобразование с long в double может быть неточным, если число находится вне диапазона ± 2 52 . Тем не менее, за несколько дней до появления 64-битного long double был удобным типом хранения для целочисленных величин, которые были слишком большими для 32-битного int , но достаточно маленького, чтобы обрабатываться double .

Обратите внимание, что преобразование a long в double , а затем выполнение сравнения даст "равный" результат, если номинальное значение double не точно соответствует значению long , но представляет собой ближайший возможно double к этому значению. Такое поведение имеет смысл, если распознавать, что типы с плавающей точкой фактически не представляют единственное точное значение, а скорее диапазон значений.

Вопрос по С++ В чем разница между функциями "double" and "int"?

Таких функций нет. Это тип возвращаемого значения функции можно указать при ее определении или тип переменной.

Остальные ответы

double вот эти числа 1.56 или 7.8787878, а int = 1,3,2,4,5,6,7,8,9,10,445, кстати, это типы переменных

Айдар ГатинУченик (74) 7 лет назад
Ооо, спасибо, теперь понял, я новичок в этом деле только изучают, спасибо
Айдар ГатинУченик (74) 7 лет назад
А функции, приведи пример функций
Айдар ГатинУченик (74) 7 лет назад
Чтобы понял лучше

Ilya Live Мастер (1417) void /*имя функции* int sum(int a, int b) < return a + b; >функция должна возвращать только целые числа, а можно и double, а вот void это тип данных, который не может хранить какие-либо данные. Тип данных void говорит о том, что данная функция не возвращает никаких значений.

Айдар ГатинУченик (74) 7 лет назад

Писать получается программы, а вот только не понимаю, что к чему относиться, что функции а что переменные

Ilya Live Мастер (1417) Переменная- это элемент, у которого есть какой-то тип Основные типы данных в C++ int — целочисленный тип данных. float — тип данных с плавающей запятой. double — тип данных с плавающей запятой двойной точности. char — символьный тип данных. bool — логический тип данных. А функция с типом только означает, что в конце должен возвращаться с таким типом, например int sum, эта функция должна возвращать только целые числа, а, например, с плавающей точкой будет число, то это будет ошибка

Встроенные типы (C++)

Встроенные типы (также называемые фундаментальными типами) задаются стандартом языка C++ и встроены в компилятор. Встроенные типы не определены в файле заголовка. Встроенные типы делятся на три основные категории: целочисленные, с плавающей запятой и void. Целочисленные типы представляют целые числа. Типы с плавающей запятой могут указывать значения, которые могут содержать дробные части. Большинство встроенных типов рассматриваются как отдельные типы компилятором. Однако некоторые типы являются синонимами или рассматриваются как эквивалентные типы компилятором.

Тип void

Тип void описывает пустой набор значений. Переменная типа void не может быть указана. Тип void используется в основном для объявления функций, которые не возвращают значения или объявляют универсальные указатели на нетипизированные или произвольные типизированные данные. Любое выражение можно явно преобразовать или привести к типу void . Однако такие выражения можно использовать только в следующих операторах и операндах:

  • в операторе выражения (Дополнительные сведения см. в разделе Выражения.)
  • в левом операнде оператора запятой (Дополнительные сведения см. в разделе Оператор запятой.)
  • во втором и третьем операндах условного оператора ( ? : ). (Дополнительные сведения см. в разделе Выражения с условным оператором.)

std::nullptr_t

Ключевое слово nullptr является константой std::nullptr_t типа null-указателя, которая преобразуется в любой необработанный тип указателя. Дополнительные сведения см. в разделе nullptr .

Тип Boolean

Тип bool может иметь значения true и false . Размер bool типа зависит от реализации. Дополнительные сведения о реализации см. в разделе "Размеры встроенных типов ".

Символьные типы

Тип char — это тип представления символов, который эффективно кодирует элементы базового набора символов выполнения. Компилятор C++ обрабатывает переменные типа char , signed char и unsigned char как переменные разных типов.

Корпорация Майкрософт: переменные типа char по умолчанию действуют как int будто из типа signed char , если /J только не используется параметр компиляции. В этом случае они рассматриваются как тип unsigned char и повышаются до int без расширения знака.

Переменная типа wchar_t — это расширенный или многобайтовый тип символов. L Используйте префикс перед символом или строковым литералом, чтобы указать тип расширенных символов.

Корпорация Майкрософт: по умолчанию wchar_t — это собственный тип, но вы можете использовать /Zc:wchar_t- его для unsigned short определения wchar_t типа. __wchar_t — синоним для машинного типа wchar_t для систем Майкрософт.

Тип char8_t используется для представления символов UTF-8. Он имеет то же представление, что unsigned char и , но рассматривается как отдельный тип компилятором. Тип char8_t новый в C++20. Корпорация Майкрософт: для использования char8_t требуется /std:c++20 параметр компилятора или более поздней версии (например /std:c++latest , ).

Тип char16_t используется для представления символов UTF-16. Оно должно быть достаточно большим, чтобы представить любую единицу кода UTF-16. Он рассматривается как отдельный тип компилятором.

Тип char32_t используется для представления символов UTF-32. Оно должно быть достаточно большим, чтобы представить любую единицу кода UTF-32. Он рассматривается как отдельный тип компилятором.

Типы с плавающей запятой

Типы с плавающей запятой используют представление IEEE-754 для обеспечения приближения дробных значений по широкому диапазону величин. В следующей таблице перечислены типы с плавающей запятой в C++ и относительные ограничения на размеры типов с плавающей запятой. Эти ограничения являются обязательными стандартом C++ и не зависят от реализации Майкрософт. Абсолютный размер встроенных типов с плавающей запятой не указан в стандарте.

Тип Содержимое
float Тип float является наименьшим типом с плавающей запятой в C++.
double double — это тип с плавающей запятой, размер которого больше или равен размеру типа float , но меньше или равен размеру типа long double .
long double long double — это тип с плавающей запятой, размер которого больше или равен размеру типа double .

Корпорация Майкрософт: представление long double и double идентично. long double Однако и double рассматриваются как отдельные типы компилятором. Компилятор Microsoft C++ использует представления с плавающей запятой 4 и 8-байтов IEEE-754. Дополнительные сведения см. в представлении с плавающей запятой IEEE.

Целочисленные типы

Тип int — базовый целочисленный тип по умолчанию. Он может представлять все целые числа по определенному диапазону реализации.

Целочисленное представление со знаком — это одно из них, которое может содержать как положительные, так и отрицательные значения. Он используется по умолчанию или signed при наличии модификатора ключевое слово. Модификатор unsigned ключевое слово указывает неподписаемое представление, которое может содержать только неотрицательных значений.

Модификатор размера указывает ширину в битах используемого целочисленного представления. Язык поддерживает short и long long long модификаторы. Тип short должен быть не менее 16 бит ширины. Тип long должен быть не менее 32 битов ширины. Тип должен быть по крайней long long мере 64-разрядным. Стандарт задает связь размера между целочисленными типами:

Реализация должна поддерживать как минимальные требования к размеру, так и отношение размера для каждого типа. Однако фактические размеры могут отличаться между реализацией. Дополнительные сведения о реализации см. в разделе "Размеры встроенных типов ".

Ключевое слово int могут быть опущены при signed unsigned указании модификаторов размера или размера. Модификаторы и int тип, если они присутствуют, могут отображаться в любом порядке. Например, short unsigned и unsigned int short ссылаться на тот же тип.

Синонимы целочисленного типа

Следующие группы типов считаются синонимами компилятора:

Типы целых чисел, зависящие от Майкрософт, включают определенные ширины __int8 , __int16 __int32 а также __int64 типы. Эти типы могут использовать signed модификаторы и unsigned модификаторы. Тип данных __int8 аналогичен типу char , __int16 — типу short , __int32 — типу int , а __int64 — типу long long .

Размеры встроенных типов

Большинство встроенных типов имеют определенные реализацией размеры. В следующей таблице перечислены объем хранилища, необходимый для встроенных типов в Microsoft C++. В частности, long 4 байта даже в 64-разрядных операционных системах.

Тип Size
bool , char , char8_t , unsigned char , signed char , __int8 1 байт
char16_t , __int16 , short , unsigned short , wchar_t , __wchar_t 2 байта
char32_t , float , __int32 , int , unsigned int , long , unsigned long 4 байта
double , __int64 , long double , long long , unsigned long long 8 байт

Сведения о диапазоне типов данных см. в сводке по диапазону значений каждого типа.

Дополнительные сведения о преобразовании типов см. в разделе "Стандартные преобразования".

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *