Float int double: В чем разница int, long и float, double? — Хабр Q&A
Встроенные числовые преобразования — справочник по C#
-
- Чтение занимает 3 мин
В этой статье
C# предоставляет набор целочисленных типов и типы с плавающей запятой.C# provides a set of integral and floating-point numeric types. Существует преобразование между любыми двумя числовыми типами: неявное или явное.There exists a conversion between any two numeric types, either implicit or explicit. Для выполнения явного преобразования необходимо использовать выражение приведения.You must use a cast expression to perform an explicit conversion.
Неявные числовые преобразованияImplicit numeric conversions
В следующей таблице приведены предопределенные неявные преобразования между встроенными числовыми типами:The following table shows the predefined implicit conversions between the built-in numeric types:
Исходный типFrom | КомуTo |
---|---|
sbytesbyte | short , int , long , float , double или decimal short , int , long , float , double , or decimal |
bytebyte | short , ushort , int , uint , long , ulong , float , double или decimal short , ushort , int , uint , long , ulong , float , double , or decimal |
shortshort | int , long , float , double или decimal int , long , float , double , or decimal |
ushortushort | int , uint , long , ulong , float , double или decimal int , uint , long , ulong , float , double , or decimal |
intint | long , float , double или decimal long , float , double , or decimal |
uintuint | long , ulong , float , double или decimal long , ulong , float , double , or decimal |
longlong | float , double или decimal float , double , or decimal |
ulongulong | float , double или decimal float , double , or decimal |
floatfloat | double |
Примечание
Неявные преобразования из int
, uint
, long
или ulong
в float
и из long
или ulong
в double
могут приводить к потере точности, но не к потере порядка величин. The implicit conversions from int
, uint
, long
, or ulong
to float
and from long
or ulong
to double
may cause a loss of precision, but never a loss of an order of magnitude. Другие неявные числовые преобразования никогда не теряют никаких сведений.The other implicit numeric conversions never lose any information.
Также обратите внимание на следующее.Also note that
Любой целочисленный тип неявно преобразуется в любой числовой тип с плавающей запятой.Any integral numeric type is implicitly convertible to any floating-point numeric type.
Не поддерживается неявное преобразование в типы
byte
иsbyte
.There are no implicit conversions to thebyte
andsbyte
types. Не поддерживается неявное преобразование из типовdouble
иdecimal
.There are no implicit conversions from thedouble
anddecimal
types.Не поддерживается неявное преобразование между типом
decimal
и типамиfloat
илиdouble
.There are no implicit conversions between thedecimal
type and thefloat
ordouble
types.Значение константного выражения типа
int
(например, значение, представленное целочисленным литералом) может быть неявно преобразовано вsbyte
,byte
,short
,ushort
,uint
илиulong
, если оно находится в диапазоне целевого типа:A value of a constant expression of typeint
(for example, a value represented by an integer literal) can be implicitly converted tosbyte
,byte
,short
,ushort
,uint
, orulong
, if it’s within the range of the destination type:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Как показано в предыдущем примере, если значение константы выходит за пределы диапазона целевого типа, возникает ошибка компилятора CS0031. As the preceding example shows, if the constant value is not within the range of the destination type, a compiler error CS0031 occurs.
Явные числовые преобразованияExplicit numeric conversions
В следующей таблице показаны предопределенные явные преобразования между встроенными числовыми типами, для которых нет неявного преобразования:The following table shows the predefined explicit conversions between the built-in numeric types for which there is no implicit conversion:
Исходный типFrom | КомуTo |
---|---|
sbytesbyte | byte , ushort , uint или ulong byte , ushort , uint , or ulong |
bytebyte | sbyte |
shortshort | sbyte , byte , ushort , uint или ulong sbyte , byte , ushort , uint , or ulong |
ushortushort | sbyte , byte или short sbyte , byte , or short |
intint | sbyte , byte , short , ushort , uint или ulong sbyte , byte , short , ushort , uint , or ulong |
uintuint | sbyte , byte , short , ushort или int sbyte , byte , short , ushort , or int |
longlong | sbyte , byte , short , ushort , int , uint или ulong sbyte , byte , short , ushort , int , uint , or ulong |
ulongulong | sbyte , byte , short , ushort , int , uint или long sbyte , byte , short , ushort , int , uint , or long |
floatfloat | sbyte , byte , short , ushort , int , uint , long , ulong или decimal sbyte , byte , short , ushort , int , uint , long , ulong , or decimal |
doubledouble | sbyte , byte , short , ushort , int , uint , long , ulong , float или decimal sbyte , byte , short , ushort , int , uint , long , ulong , float , or decimal |
decimaldecimal | sbyte , byte , short , ushort , int , uint , long , ulong , float или double sbyte , byte , short , ushort , int , uint , long , ulong , float , or double |
Примечание
Явное числовое преобразование может привести к утрате данных или созданию исключения, обычно OverflowException. An explicit numeric conversion might result in data loss or throw an exception, typically an OverflowException.
Также обратите внимание на следующее.Also note that
При преобразовании значения целочисленного типа в другой целочисленный тип результат зависит от переполнения контекста проверки.When you convert a value of an integral type to another integral type, the result depends on the overflow checking context. В проверенном контексте преобразование выполняется успешно, если исходное значение находится в диапазоне конечного типа.In a checked context, the conversion succeeds if the source value is within the range of the destination type. В противном случае возникает исключение OverflowException.Otherwise, an OverflowException is thrown. В непроверяемом контексте преобразование всегда завершается успешно и выполняется следующим образом.In an unchecked context, the conversion always succeeds, and proceeds as follows:
Если исходный тип больше целевого, исходное значение усекается путем отбрасывания его «лишних» самых значимых битов.If the source type is larger than the destination type, then the source value is truncated by discarding its «extra» most significant bits. Результат затем обрабатывается как значение целевого типа.The result is then treated as a value of the destination type.
Если исходный тип меньше целевого, исходное значение дополняется знаками или нулями, чтобы иметь тот же размер, что и целевой тип.If the source type is smaller than the destination type, then the source value is either sign-extended or zero-extended so that it’s of the same size as the destination type. Знаки добавляются, если исходный тип имеет знак. Если у исходного типа нет знака, добавляются нули.Sign-extension is used if the source type is signed; zero-extension is used if the source type is unsigned. Результат затем обрабатывается как значение целевого типа.The result is then treated as a value of the destination type.
Если исходный тип совпадает по размеру с целевым, исходное значение обрабатывается как значение целевого типа. If the source type is the same size as the destination type, then the source value is treated as a value of the destination type.
При преобразовании значения
decimal
в целочисленный тип оно округляется в сторону нуля до ближайшего целого значения.When you convert adecimal
value to an integral type, this value is rounded towards zero to the nearest integral value. Если итоговое целое значение находится вне диапазона целевого типа, возникает исключение OverflowException.If the resulting integral value is outside the range of the destination type, an OverflowException is thrown.При преобразовании значения
double
илиfloat
в целочисленный тип оно округляется в сторону нуля до ближайшего целого значения.When you convert adouble
orfloat
value to an integral type, this value is rounded towards zero to the nearest integral value. Если полученное целое значение выходит за пределы диапазона целевого типа, результат будет зависеть от контекста проверки переполнения.If the resulting integral value is outside the range of the destination type, the result depends on the overflow checking context. В проверенном контексте возникает исключение OverflowException, а в непроверенном контексте результатом будет неопределенное значение целевого типа.In a checked context, an OverflowException is thrown, while in an unchecked context, the result is an unspecified value of the destination type.При преобразовании из
double
вfloat
значениеdouble
округляется до ближайшего значенияfloat
.When you convertdouble
tofloat
, thedouble
value is rounded to the nearestfloat
value. Если значениеdouble
слишком мало или слишком велико для типаfloat
, результатом будет ноль или бесконечность соответственно.If thedouble
value is too small or too large to fit into thefloat
type, the result is zero or infinity.При преобразовании из
float
илиdouble
вdecimal
исходное значение преобразуется в представлениеdecimal
и при необходимости округляется до ближайшего числа после 28-го десятичного разряда.When you convertfloat
ordouble
todecimal
, the source value is converted todecimal
representation and rounded to the nearest number after the 28th decimal place if required. В зависимости от исходного значения возможны следующие результаты:Depending on the value of the source value, one of the following results may occur:Если исходное значение слишком мало для представления в виде
decimal
, результатом будет ноль.If the source value is too small to be represented as adecimal
, the result becomes zero.Если исходное значение не является числом (NaN), равно бесконечности или слишком велико для представления в виде
decimal
, возникает исключение OverflowException.If the source value is NaN (not a number), infinity, or too large to be represented as adecimal
, an OverflowException is thrown.
При преобразовании из
decimal
вfloat
илиdouble
исходное значение округляется до ближайшего значенияfloat
илиdouble
соответственно.When you convertdecimal
tofloat
ordouble
, the source value is rounded to the nearestfloat
ordouble
value, respectively.
Спецификация языка C#C# language specification
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:For more information, see the following sections of the C# language specification:
См. такжеSee also
Преобразование типов при присваивании | Программирование на C и C++
Преобразование типов предназначено для ситуации, в которой переменные одного типа смешиваются с переменными другого типа. Когда возникает подобная ситуация в операторе присваивания, используется правило преобразования типов: значение справа (выражение) от оператора присваивания преобразуется к типу объекта, стоящего слева (целевой переменной). Это демонстрируется следующим примером:
int х;
char ch;
float f;
void func(void)
{
ch = х; /* 1 */
х = f; /* 2 */
f = ch; /* 3 */
f = x; /* 4 */
}
В строке 1 левые, старшие, биты целочисленной переменной х обрубаются, оставляя в ch младшие 8 битов. Если х содержит число между 256 и 0, то ch и х будут иметь одинаковое значение Иначе значение ch будет содержать только младший набор битов переменной х. В строке 2 х получает целую часть переменной f. В строке 3 f получает 8-битное целое число, хранящееся в ch преобразованное к формату с плавающей точкой. В строке 4 f получает значение целочисленной переменной х, преобразованное к формату с плавающей точкой.
Когда происходит преобразование из целого числа к символу, из длинного целого — к целому и из целого — к короткому целому, то старшие биты будут потеряны. Когда используется 16-битное целое, это означает, что 8 бит будут потеряны при преобразовании от целого к символу и 16 бит будут потеряны при преобразовании от длинного целого к целому.
Таблица содержит все преобразования типов. Следует помнить два важных момента, которые могут повлиять на переносимость создаваемого кода:
Целевой тип | Исходный тип | Возможные потери информации |
---|---|---|
signed char | unsigned char | Если значение > 127, то результат станет отрицательным числом |
char | short int | Старшие 8 бит |
char | int (16 бит) | Старшие 8 бит |
char | int (32 бита) | Старшие 24 бита |
short int | int (16 бит) | Нет |
short int | int (32 бита) | Старшие 16 бит |
int (16 бит) | long int | Старшие 16 бит |
int (32 бита) | long int | Нет |
float | double | Точность, результат округляется |
double | long double | Точность, результат округляется |
- Преобразование из int в float или из float в double и тому подобное не добавляет точности. Такого рода преобразования только изменяют формат представления значения.
- Некоторые компиляторы С (и процессоры) всегда трактуют переменные типа char как положительные, независимо от того, какое значение было при преобразовании к целому или плавающему типам. Другие компиляторы могут трактовать переменную типа char как знаковую, где числа, большие, чем 127, трактуются как отрицательные (как делает Borland С++). В целом следует использовать переменные типа char для символов, a int, short int или signed char когда необходимо избежать проблем с переносимостью.
Для получения преобразования, не указанного в таблице, надо просто пошагово преобразовывать типы, пока не получится нужный тип. Например, для преобразования из double в int сначала следует преобразовать double в float, а затем float в int.
При использовании компьютерного языка типа Паскаль, где запрещено автоматическое преобразование типов, можно подумать, что С — слишком скользкий язык. Следует помнить, что С разрабатывался для облегчения жизни программистов, предоставляя возможность работать на нем, а не на ассемблере. С этой целью С позволяет осуществлять такие преобразования типов.
Что означают int, float, double, char, bool.
помогите пожалуйста
присоединенные территории при Ольгерде
Нужен ответ с решением!! Срочно! Даю 80б!!!!помогите пожалуйста!!!
Привет ! Как имея под рукой ucb вывести с телефона на телевизор изображение. Хочу посмотреть фильмы =/Телевизор:TOSHIBA2013 — 069Aug 03 2013
Где все эпитеты и метафоры
В. Ґете «Нічна пісня подорожнього»
На гірських вершинах
Спить сніг.
Вітерець в долинах
Затих.
Тиша без краю, безмеж.
Змовкн
…
ув пташиний галас.
Почекай — зараз
Ти заснеш теж.
Задача № 2 К Вам в аптеку поступили следующие ЛП: бициллин-1 во флаконах по 1200000 ЕД, кетоконазол в таблетках по 0, 2 г, ацикловир в виде 5 % мази в
…
тубах по 5 г. Задание: 1. Разделите эти препараты по спектру их химиотерапевтического действия. 2. Объясните механизм действия препаратов. Укажите, с чем связана избирательность химиотерапевтического действия каждого из препаратов. 3. Перечислите и обоснуйте показания к применению препаратов с учетом лекарственной формы. 4. Перечислите побочные эффекты препаратов. Задача № 3 К провизору безрецептурного отдела аптеки («первого стола») обратился пациент со следующей рецептурной прописью: Rp.: Doxycyclini hydrochloridi 0,05 D.t.d. № 20 in capsulis S. По 2 капсулы 2 раза в сутки. # Rp.: Nystatini 250000 ED D.t.d. № 30 in tabulettis S. Внутрь по 1 таблетке 2 раза в сутки. Задание: 1.Укажите, к каким группам химиотерапевтических средств относятся выписанные в рецепте препараты. 2.Объясните, с какой целью врач назначил данную комбинацию. 3.Объясните механизм действия препаратов. Укажите, с чем связана избирательность химиотерапевтического действия каждого из препаратов. 4.Назовите показания к применению Доксициклина и Нистатина. 5.Проинформируйте пациента о возможных побочных эффектах, вызванных применением Доксициклина. Задача № 4 К провизору «первого стола» обратился пациент со следующей рецептурной прописью: Rp.: Azytromycini 0,25 D.t.d. № 20 in capsulis S. Внутрь по 2 капсулы 2 раза в сутки. # Rp.: Chloramphenicoli 0,25 D.t.d. № 30 in tab. S. Внутрь по 1 таблетке 3 раза в сутки. Задание: 1.Укажите, к каким группам антибактериальных средств относятс
Задача № 2 К Вам в аптеку поступили следующие ЛП: бициллин-1 во флаконах по 1200000 ЕД, кетоконазол в таблетках по 0, 2 г, ацикловир в виде 5 % мази в
…
тубах по 5 г. Задание: 1. Разделите эти препараты по спектру их химиотерапевтического действия. 2. Объясните механизм действия препаратов. Укажите, с чем связана избирательность химиотерапевтического действия каждого из препаратов. 3. Перечислите и обоснуйте показания к применению препаратов с учетом лекарственной формы. 4. Перечислите побочные эффекты препаратов. Задача № 3 К провизору безрецептурного отдела аптеки («первого стола») обратился пациент со следующей рецептурной прописью: Rp. : Doxycyclini hydrochloridi 0,05 D.t.d. № 20 in capsulis S. По 2 капсулы 2 раза в сутки. # Rp.: Nystatini 250000 ED D.t.d. № 30 in tabulettis S. Внутрь по 1 таблетке 2 раза в сутки. Задание: 1.Укажите, к каким группам химиотерапевтических средств относятся выписанные в рецепте препараты. 2.Объясните, с какой целью врач назначил данную комбинацию. 3.Объясните механизм действия препаратов. Укажите, с чем связана избирательность химиотерапевтического действия каждого из препаратов. 4.Назовите показания к применению Доксициклина и Нистатина. 5.Проинформируйте пациента о возможных побочных эффектах, вызванных применением Доксициклина. Задача № 4 К провизору «первого стола» обратился пациент со следующей рецептурной прописью: Rp.: Azytromycini 0,25 D.t.d. № 20 in capsulis S. Внутрь по 2 капсулы 2 раза в сутки. # Rp.: Chloramphenicoli 0,25 D.t.d. № 30 in tab. S. Внутрь по 1 таблетке 3 раза в сутки. Задание: 1.Укажите, к каким группам антибактериальных средств относятс
Что вреднее 1) микробы 2) молоко.
Складіть діалог Вільяма Леграна та Шерлока Холмса про методи їхнього розслідування.
или
Складіть діалог доктора Ватсона та Джупітера про свого господа
…
ря та компаньйона та методи їхніх розслідувань.
яке було значення книгодрукування для розвитку європейської культури
Типы данных float и double в языке программирования Java / Программирование / ADODO.ru
Простые, или примитивные, типы данных — это встроенные в язык Java типы, аналогичные типам данных большинства языков программирования. Эти типы могут применяться самостоятельно или используются как составные части более сложных типов данных, которые создают программисты.
Java позволяет использовать 8 простых типов данных:
byte, short, int, long – целочисленные,
float, double — вещественные обычной и двойной точности,
boolean — булевские (логические, представляющие истину или ложь),
сhar — символьные, представляющие символы Unicode.
Float и double применяются для выполнения инженерных и научных расчетов.
Если данные по смыслу задачи могут иметь дробную часть, применяют вещественные (синоним — действительные) данные.
Выбор между float и double делают, исходя из необходимой точности представления данных.
Тип double содержит почти вдвое больше значащих цифр, чем float, и больший диапазон показателя степени.
В вещественных данных три части — знак s (равен 1 или -1) мантисса m и порядок p. Числа представлены в двоичной системе. Мантисса m хранит значащие цифры числа. Произведение мантиссы и основания системы, возведенного в степень, равную порядку, дает истинную величину числа s.
С вещественными данными можно выполнять обычные арифметические операции (+-*/), результат которых — тоже вещественное число. Сравнение действительных данных выполняется операциями <, >, <=, >=, ==, != (меньше, больше, не больше, не меньше, равно, не равно). Следует проявлять внимательность при сравнении действительных данных и действительных литералов, поскольку действительные данные представляются с погрешностью.
Каждому простому типу в языке Java соответствует объектный тип — так называемый класс-оболочка (wrapper class). Классы-оболочки (для float и double это Float и Double) содержат полезные и интересные методы для проверок свойств данных или для их преобразования в другие типы.
Подробная информация о классах-оболочках имеется в документации по Java.
Основные типы | Kotlin
В Kotlin все является объектом в том смысле, что мы можем вызывать функции-члены и свойства любой переменной. Некоторые типы могут иметь специальное внутреннее представление — например, числа, символы и логические значения могут быть представлены как примитивные значения во время выполнения — но для пользователя они выглядят как обычные классы. В этом разделе мы описываем основные типы, используемые в Kotlin: числа, логические значения, символы, строки и массивы.
Числа
Целочисленные типы
Kotlin предоставляет набор встроенных типов, представляющих числа.
Для целых чисел существует четыре типа с разными размерами и, следовательно, диапазонами значений.
Тип | Размер (биты) | Мин. Значение | Макс. Значение |
---|---|---|---|
Байт | 8 | -128 | 127 |
Короткий | 16 | -32768 | 32767 |
Внутренний | 32 | -2 147 483 648 (-2 31 ) | 2 147 483 647 (2 31 — 1) |
Длинный | 64 | -9 223 372 036 854 775 8052 (-2 63 ) | 9 223 372 036 854 775 807 (2 63 — 1) |
Все переменные, инициализированные целочисленными значениями, не превышающими максимальное значение Int
, имеют предполагаемый тип Int
.Если начальное значение превышает это значение, то тип — Long
. Чтобы явно указать значение Long
, добавьте к значению суффикс L
.
val one = 1 // Целое число
val threeBillion = 3000000000 // Длинный
val oneLong = 1L // Длинный
val oneByte: Byte = 1
Типы с плавающей запятой
Для вещественных чисел Kotlin предоставляет типы с плавающей запятой Float
и Double
. Согласно стандарту IEEE 754, типы с плавающей запятой отличаются своим десятичным знаком , то есть тем, сколько десятичных цифр они могут хранить. Float
соответствует стандарту IEEE 754 одинарной точности , а Double
обеспечивает двойной точности .
Тип | Размер (биты) | Значимые биты | Биты экспоненты | Десятичные цифры |
---|---|---|---|---|
Float | 32 | 24 | 8 | 6-7 |
Double | 64 | 53 | 11 | 15-16 |
Вы можете инициализировать переменные Double
и Float
с числами, имеющими дробную часть. Он отделен от целой части точкой (.
). Для переменных, инициализированных дробными числами, компилятор выводит тип Double
.
val pi = 3,14 // Двойное значение
// val one: Double = 1 // Ошибка: несоответствие типов
val oneDouble = 1.0 // Двойное
Чтобы явно указать тип Float
для значения, добавьте суффикс f
или F
. Если такое значение содержит более 6-7 десятичных цифр, оно будет округлено.
val e = 2.7182818284 // Двойной
val eFloat = 2.7182818284f // Float, фактическое значение 2.7182817
Обратите внимание, что в отличие от некоторых других языков, в Kotlin нет неявных расширяющих преобразований для чисел. Например, функция с параметром Double
может быть вызвана только для значений Double
, но не для Float
, Int
или других числовых значений.
fun main () {
весело printDouble (d: Double) {print (d)}
значение я = 1
значение d = 1.0
значение f = 1.0f
printDouble (d)
// printDouble (i) // Ошибка: несоответствие типа
// printDouble (f) // Ошибка: несоответствие типа
}
Для преобразования числовых значений в разные типы используйте явные преобразования.
Литеральные константы
Существуют следующие виды буквальных констант для целочисленных значений:
- Десятичные числа:
123
Шестнадцатеричные числа:
0x0F
Двоичные числа:
0b2060000109
Двоичные числа:
0b2060000109 не поддерживается.
Kotlin также поддерживает обычную нотацию для чисел с плавающей запятой:
Двойные значения по умолчанию:
123.5
,123.5e10
Поплавки помечены как
f
илиF
:123.5f
Чтобы сделать числовые константы более удобочитаемыми, можно использовать символы подчеркивания:
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val байты = 0b11010010_01101001_10010100_10010010Представление чисел в JVM
На платформе JVM числа хранятся как примитивные типы:
int
,double
и т. Д.Исключениями являются случаи, когда вы создаете ссылку на число, допускающее значение NULL, напримерInt?
или используйте дженерики. В этих случаях числа помещаются в классы JavaInteger
,Double
и так далее.Обратите внимание, что обнуляемые ссылки на один и тот же номер могут быть разными объектами:
fun main () {
// sampleStart
val a: Int = 100
val boxedA: Int? = а
val anotherBoxedA: Int? = азначение b: Int = 10000
val boxedB: Int? = b
val anotherBoxedB: Int? = bprintln (boxedA === anotherBoxedA) // правда
println (boxedB === anotherBoxedB) // ложь
// sampleEnd
}С другой стороны, они все равно равны:
fun main () {
// sampleStart
val a: Int = 10000
println (a == a) // выводит true
val boxedA: Int? = а
val anotherBoxedA: Int? = а
println (boxedA == anotherBoxedA) // выводит true
// sampleEnd
}Явные преобразования
Из-за различных представлений меньшие типы не являются подтипами больших.Если бы они были, у нас были бы проблемы следующего вида:
// Гипотетический код, на самом деле не компилируется:
val a: Int? = 1 // Упакованный Int (java.lang.Integer)
val b: Долго? = a // неявное преобразование дает упакованный Long (java.lang.Long)
print (b == a) // Сюрприз! Это печатает "false", так как Equals () Long проверяет, является ли другой также Long.Значит, молча потеряли бы равенство, не говоря уже об идентичности.
Как следствие, меньшие типы НЕ преобразовываются неявно в более крупные типы.Это означает, что присвоение значения типа
Byte
переменнойInt
требует явного преобразования.fun main () {
// sampleStart
val b: Byte = 1 // ОК, литералы проверяются статически
// val i: Int = b // ОШИБКА
значение i1: Int = b.toInt ()
// sampleEnd
}Все типы номеров поддерживают преобразование в другие типы:
-
toByte (): Byte
-
toShort (): Short
-
toInt (): Int
-
toLong (): Long
-
toFloat (): Float
-
toDouble (): Double
-
toChar (): Char
Во многих случаях явные преобразования не требуются, поскольку тип выводится из контекста и арифметического операции перегружены для соответствующих преобразований, например:
val l = 1L + 3 // Long + Int => Long
Операции
Kotlin поддерживает стандартный набор арифметических операций над числами:
+
,-
,*
,/
,%
. Они объявляются членами соответствующих классов.fun main () {
// sampleStart
println (1 + 2)
println (2_500_000_000L - 1L)
println (3,14 * 2,71)
println (10.0 / 3)
// sampleEnd
}Вы также можете переопределить эти операторы для пользовательских классов. Подробнее см. Перегрузка оператора.
Деление целых чисел
Деление целых чисел всегда возвращает целое число. Любая дробная часть отбрасывается.
fun main () {
// sampleStart
значение x = 5/2
// println (x == 2.5) // ОШИБКА: оператор '==' нельзя применить к 'Int' и 'Double'
println (x == 2)
// sampleEnd
}Это верно для разделения между любыми двумя целочисленными типами.
fun main () {
// sampleStart
значение x = 5L / 2
println (x == 2L)
// sampleEnd
}Чтобы вернуть тип с плавающей запятой, явно преобразуйте один из аргументов в тип с плавающей запятой.
fun main () {
// sampleStart
значение x = 5/2. toDouble ()
println (x == 2,5)
// sampleEnd
}Побитовые операции
Kotlin предоставляет набор из побитовых операций над целыми числами.Они работают на двоичном уровне напрямую с битами представления чисел. Побитовые операции представлены функциями, которые можно вызывать в инфиксной форме. Их можно применить только к
Int
иLong
.val x = (1 shl 2) и 0x000FF000
Вот полный список побитовых операций:
shl (биты)
- сдвиг влево со знакомshr (биты)
- сдвиг вправо со знакомushr (биты)
- беззнаковый сдвиг вправои (биты)
- побитовые иили (биты)
- побитовые илиxor (биты)
- побитовые xorinv ()
- побитовая инверсия
Сравнение чисел с плавающей запятой
В этом разделе обсуждаются следующие операции с числами с плавающей запятой:
Проверки равенства:
a == b
иa ! = b
Операторы сравнения:
a ,
a> b
,a <= b
,a> = b
Создание экземпляра диапазона a nd диапазон проверок:
a. 64 - 1
Типы без знака поддерживают большинство операций своих подписанных аналогов.
Изменение типа с беззнакового на подписанный аналог (и наоборот) - это двоичное несовместимое изменение .
Беззнаковые типы реализуются с использованием еще нестабильной функции, а именно встроенных классов.
Беззнаковые массивы и диапазоны
Как и для примитивов, каждый беззнаковый тип имеет соответствующий тип, представляющий массивы этого типа:
UByteArray
: массив байтов без знакаUShortArray
: an беззнаковых коротких замыканийUIntArray
: массив целых чисел без знакаULongArray
: массив длинных длин без знака
То же, что и для целочисленных массивов со знаком, они предоставляют аналогичный API для класса
Array
бокс над головой.Кроме того, диапазоны и прогрессии поддерживаются для
UInt
иULong
классамиUIntRange
,UIntProgression
,ULongRange
иULongProgression
.Литералы
Чтобы упростить использование целых чисел без знака, Kotlin предоставляет возможность пометить целочисленный литерал суффиксом, указывающим на конкретный тип без знака (аналогично
Float
илиLong
):val b: UByte = 1u // UByte, ожидаемый тип предоставлен
val s: UShort = 1u // UShort, указан ожидаемый тип
val l: ULong = 1u // ULong, указан ожидаемый типval a1 = 42u // UInt: не указан ожидаемый тип, константа подходит для UInt
val a2 = 0xFFFF_FFFF_FFFFu // ULong: не указан ожидаемый тип, константа не помещается в UIntval a = 1UL // ULong, даже если не указан ожидаемый тип и константа подходит для UInt
Бета-статус беззнаковых целых чисел
Беззнаковые типы разрабатываются в бета-версии, что означает, что их совместимость возможна только при максимальных усилиях и не гарантируется.
При использовании беззнаковой арифметики будет выдано предупреждение, указывающее, что эта функция не была выпущена в стабильную версию. Чтобы удалить это предупреждение, вы должны выбрать использование беззнаковых типов:
. Чтобы распространить требование согласия, аннотируйте объявления, использующие беззнаковые целые числа, с помощью
@ExperimentalUnsignedTypes
.Чтобы подписаться без распространения, либо аннотируйте объявления с помощью
@OptIn (ExperimentalUnsignedTypes :: class)
, либо передайте-Xopt-in = kotlin.ExperimentalUnsignedTypes
компилятору.
Вам решать, должны ли ваши клиенты явно соглашаться на использование вашего API, но имейте в виду, что неподписанные типы не являются стабильной функцией, поэтому API, который их использует, может быть внезапно сломан из-за изменений в язык.
Подробную информацию об использовании API, требующих согласия, см. В требованиях к подписке.
Дальнейшее обсуждение
Технические подробности и дальнейшее обсуждение см. В предложении по языку для неподписанных типов.
Boolean
Тип
Boolean
представляет логические объекты, которые могут иметь два значения:true
иfalse
.Boolean
имеет аналог, допускающий значение NULLBoolean?
, который также имеет значениеnull
.Встроенные операции с логическими значениями включают:
||
- дизъюнкция (логическая ИЛИ )&&
- конъюнкция (логическая И )!
- отрицание (логическое НЕ )
||
и&&
работают лениво.fun main () {
// sampleStart
val myTrue: Boolean = true
val myFalse: Boolean = false
val boolNull: логическое значение? = нольprintln (myTrue || myFalse)
println (myTrue && myFalse)
println (! myTrue)
// sampleEnd
}На JVM : обнуляемые ссылки на логические объекты заключены в рамку аналогично числам.
Символы
Символы представлены типом
Char
. Символьные литералы заключаются в одинарные кавычки:'1'
.Специальные символы начинаются с обратной косой черты
\
. Поддерживаются следующие escape-последовательности:\ t
,\ b
,\ n
,\ r
,\ '
,\ "
,\
и\ $
.Чтобы закодируйте любой другой символ, используйте синтаксис escape-последовательности Unicode:
'\ uFF00'
.fun main () {
// sampleStart
val aChar: Char = 'a'println (aChar)
println ('\ n') // выводит дополнительный символ новой строки
println ('\ uFF00')
// sampleEnd
}Если значением символьной переменной является цифра, вы можете явно преобразовать ее в
Int
number:fun decimalDigitValue (c: Char): Int {
если (c! в '0'..'9 ')
throw IllegalArgumentException ("За пределами допустимого диапазона")
return c.toInt () - '0'.toInt () // Явное преобразование в числа
}На JVM : Как и числа, символы помещаются в рамку, когда требуется ссылка, допускающая значение NULL. Идентичность не сохраняется при операции бокса.
Строки
Строки в Котлине представлены типом
String
. Как правило, строковое значение представляет собой последовательность символов в двойных кавычках ("
).val str =" abcd 123 "
Элементы строки - это символы, к которым можно получить доступ с помощью операции индексации:
s [i]
.Вы можете перебирать эти символы с помощью цикладля
:fun main () {
val str = "abcd"
// sampleStart
for (c in str) {
println (c)
}
// sampleEnd
}Строки неизменяемы. После инициализации строки вы не можете изменить ее значение или присвоить ей новое значение. Все операции по преобразованию строк возвращают свои результаты в новом объекте
String
, оставляя исходную строку неизменной.fun main () {
// sampleStart
val str = "abcd"
println (ул.toUpperCase ()) // Создаем и распечатываем новый объект String
println (str) // исходная строка остается той же
// sampleEnd
}Для объединения строк используйте оператор
+
. Это также работает для объединения строк со значениями других типов, если первым элементом выражения является строка:fun main () {
// sampleStart
val s = "abc" + 1
println (s + "def")
// sampleEnd
}Обратите внимание, что в большинстве случаев использование строковых шаблонов или необработанных строк предпочтительнее конкатенации строк.
Строковые литералы
В Kotlin есть два типа строковых литералов:
Вот пример экранированной строки:
val s = "Hello, world! \ N"
Экранирование осуществляется обычным способом, с обратной косой чертой (
\
). Список поддерживаемых escape-последовательностей см. В разделе «Символы» выше.Необработанная строка разделена тройной кавычкой (
"" "
), не содержит экранирования и может содержать символы новой строки и любые другие символы:val text =" ""
for (c in "foo")
печать (с)
"" "Чтобы удалить ведущие пробелы из необработанных строк, используйте функцию
trimMargin ()
:val text = "" "
| Скажи мне, и я забуду.| Научи меня, и я запомню.
| Вовлеките меня, и я узнаю.
| (Бенджамин Франклин)
"" ".trimMargin ()По умолчанию
|
используется как префикс поля, но вы можете выбрать другой символ и передать его в качестве параметра, напримерtrimMargin (">")
.Строковые шаблоны
Строковые литералы могут содержать шаблонов выражений - фрагментов кода, которые оцениваются и результаты которых объединяются в строку. Выражение шаблона начинается со знака доллара (
$
) и состоит из имени:fun main () {
// sampleStart
val i = 10
println ("i = $ i") // выводит "i = 10"
// sampleEnd
}или выражение в фигурных скобках:
fun main () {
// sampleStart
val s = "abc"
println ("$ s. length is $ {s.length} ") // выводит" abc.length is 3 "
// sampleEnd
}Шаблоны можно использовать как в необработанных, так и в экранированных строках. Чтобы вставить символ
$
в необработанную строку (которая не поддерживает экранирование обратной косой черты), используйте следующий синтаксис:val price = "" "
$ {'$'} 9,99
"" "Массивы
Массивы в Котлине представлены классом
Массив
. Он имеет функцииget
иset
, которые превращаются в[]
в соответствии с соглашениями о перегрузке операторов, и свойствоsize
, а также другие полезные функции-члены:class Array
private constructor () {
размер val: Int
оператор fun get (индекс: Int): T
набор функций оператора (индекс: Int, значение: T): Unitоператор fun iterator (): Iterator
//...
}Чтобы создать массив, используйте функцию
arrayOf ()
и передайте ей значения элементов, так чтоarrayOf (1, 2, 3)
создает массив[1, 2, 3]
. В качестве альтернативы можно использовать функциюarrayOfNulls ()
для создания массива заданного размера, заполненногонулевыми и
элементами.Другой вариант - использовать конструктор
Array
, который принимает размер массива и функцию, которая возвращает значения элементов массива с учетом его индекса:fun main () {
// sampleStart
// Создает массивсо значениями [«0», «1», «4», «9», «16»]
val asc = Массив (5) {я -> (я * я).нанизывать() }
asc.forEach {println (it)}
// sampleEnd
}Как мы уже говорили выше, операция
[]
означает вызовы функций-членовget ()
иset ()
.Массивы в Котлине инвариантны . Это означает, что Kotlin не позволяет нам назначать массив
Array
, см. 5 * 0 +.2Однако компьютер не может сохранить это: у него нет явного метода выражения этой двоичной точки (версия десятичной точки в двоичной системе счисления). Компьютер может хранить только единицы и нули. Здесь на помощь приходит тип данных с плавающей запятой.
Предполагая, что sizeof (float) составляет 4 байта, у вас всего 32 бита. Первому биту назначается «знаковый бит». Нет беззнаковых чисел с плавающей запятой или двойных чисел. Следующие 8 битов используются для «экспоненты», а последние 23 бита используются как «мантисса» (или иногда называемая мантиссой).1, и наше значение было бы 1.111.
Если первый бит равен 1, число отрицательное. Если нет, то положительно. Показатель степени изменяется так называемым «смещением», поэтому мы не можем просто сохранить «0000 0010» в качестве показателя степени. Смещение для числа с плавающей запятой одинарной точности составляет 127, а смещение для двойной точности (именно здесь тип данных double и получает свое имя) составляет 1023. Последние 23 бита зарезервированы для мантиссы. Мантисса - это просто значения СПРАВА от нашей двоичной точки.
Наша экспонента будет представлять собой смещение (127) + показатель (1) или представлена в двоичном формате
1000 0000
Наше значение будет:
111 0000 0000 0000 0000 0000
Следовательно, 3,75 представляется как:
0100 0000 0111 0000 0000 0000 0000 0000
Теперь давайте посмотрим на число 8, представленное как число с плавающей запятой и как целое число:
0100 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000
Как вообще компьютер прибавит 8.0 и 8? Или даже умножить их !? Компьютеры (точнее, компьютеры x86) имеют разные части ЦП, которые добавляют числа с плавающей запятой и целые числа.
базовых типов данных в Python - настоящий Python
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Просмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Основные типы данных в Python
Теперь вы знаете, как взаимодействовать с интерпретатором Python и выполнять код Python.Пришло время углубиться в язык Python. Сначала мы обсудим основные типы данных, встроенные в Python.
Из этого руководства вы узнаете:
- Вы узнаете о нескольких базовых числовых , строковых и логических типах , встроенных в Python. К концу этого руководства вы будете знакомы с тем, как выглядят объекты этих типов и как их представлять.
- Вы также получите обзор встроенных в Python функций . Это заранее написанные фрагменты кода, которые вы можете вызывать, чтобы делать полезные вещи. Вы уже видели встроенную функцию
print ()
, но есть и многие другие.
Пройдите тест: Проверьте свои знания с помощью нашей интерактивной викторины «Основные типы данных в Python». По завершении вы получите оценку, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройти тест »
Целые числа
В Python 3 фактически нет ограничений на длину целочисленного значения.Конечно, оно, как и все остальное, ограничено объемом памяти вашей системы, но помимо этого целое число может быть сколь угодно длинным:
>>>
>>> печать (123123123123123123123123123123123123123123123123 + 1) 123123123123123123123123123123123123123123123124
Python интерпретирует последовательность десятичных цифр без префикса как десятичное число:
Следующие строки могут быть добавлены к целочисленному значению, чтобы указать основание, отличное от 10:
Префикс Интерпретация База 0b
(ноль + строчная буква'b'
)
0B
(ноль + прописная буква'B'
)двоичный 2 0o
(ноль + строчная буква'o'
)
0O
(ноль + прописная буква'O'
)восьмеричное 8 0x
(ноль + строчная буква'x'
)
0X
(ноль + прописная буква'X'
)Шестнадцатеричный 16 Например:
>>>
>>> print (0o10) 8 >>> печать (0x10) 16 >>> print (0b10) 2
Дополнительные сведения о целочисленных значениях с недесятичным основанием см. На следующих сайтах Википедии: двоичный, восьмеричный и шестнадцатеричный.
Базовый тип целого числа Python, независимо от базы, используемой для его определения, называется
int
:>>>
>>> тип (10) <класс 'int'> >>> тип (0o10) <класс 'int'> >>> тип (0x10) <класс 'int'>
Примечание: Сейчас хорошее время, чтобы упомянуть, что если вы хотите отобразить значение во время сеанса REPL, вам не нужно использовать функцию
print ()
. Просто введите значение в строке>>>
и нажмите Enter , чтобы отобразить его:>>>
>>> 10 10 >>> 0x10 16 >>> 0b10 2
Многие примеры в этой серии руководств будут использовать эту функцию.
Обратите внимание, что это не работает внутри файла сценария. Значение, которое появляется в отдельной строке файла сценария, ничего не делает.
Числа с плавающей запятой
Тип
float
в Python обозначает число с плавающей запятой.float Значения
указываются с десятичной точкой. При желании можно добавить символe
илиE
, за которым следует положительное или отрицательное целое число, чтобы указать экспоненциальное представление:>>>
>>> 4.2 4.2 >>> тип (4.2) <класс 'float'> >>> 4. 4.0 >>> .2 0,2 >>> .4e7 4000000,0 >>> введите (.4e7) <класс 'float'> >>> 4.2e-4 0,00042
Deep Dive: представление с плавающей запятой
Ниже приводится более подробная информация о том, как Python внутренне представляет числа с плавающей запятой. Вы можете легко использовать числа с плавающей запятой в Python, не понимая их до этого уровня, поэтому не беспокойтесь, если это кажется слишком сложным.Информация представлена здесь на случай, если вам интересно.
Почти все платформы представляют значения Python
float
как 64-битные значения «двойной точности» в соответствии со стандартом IEEE 754. В этом случае максимальное значение, которое может иметь число с плавающей запятой, составляет примерно 1,8 Â 10 308 . Python укажет число большее, чем это, в строкеinf
:>>>
>>> 1.79e308 1.79e + 308 >>> 1.8e308 инф
Самое близкое к нулю ненулевое число - приблизительно 5.0 ⨉ 10 -324 . Все, что ближе к нулю, фактически равно нулю:
>>>
>>> 5e-324 5e-324 >>> 1e-325 0,0
Числа с плавающей запятой внутри представляются в виде двоичных (основание 2) дробей. Большинство десятичных дробей не могут быть представлены точно как двоичные дроби, поэтому в большинстве случаев внутреннее представление числа с плавающей запятой является приближением фактического значения. На практике разница между фактическим значением и представленным значением очень мала и обычно не вызывает серьезных проблем.
Комплексные числа
Комплексные числа задаются как
<действительная часть> + <мнимая часть> j
. Например:>>>
>>> 2 + 3j (2 + 3j) >>> тип (2 + 3j) <класс 'сложный'>
Струны
Строки - это последовательности символьных данных. Тип строки в Python называется
str
.Строковые литералы могут быть разделены одинарными или двойными кавычками. Все символы между открывающим разделителем и совпадающим закрывающим разделителем являются частью строки:
>>>
>>> print («Я строка.") Я струна. >>> type («Я - строка.») <класс 'str'> >>> print ('Я тоже.') Я тоже. >>> введите ('Я тоже.') <класс 'str'>
Строка в Python может содержать сколько угодно символов. Единственное ограничение - это ресурсы памяти вашего компьютера. Строка также может быть пустой:
Что, если вы хотите включить символ кавычки как часть самой строки? Вашим первым импульсом может быть что-то вроде этого:
>>>
>>> print ('Эта строка содержит одинарную кавычку ('). ') SyntaxError: недопустимый синтаксис
Как видите, это не так хорошо. Строка в этом примере открывается одинарной кавычкой, поэтому Python предполагает, что следующая одинарная кавычка, заключенная в круглые скобки, которая должна была быть частью строки, является закрывающим разделителем. В этом случае последняя одинарная кавычка является ошибочной и вызывает указанную синтаксическую ошибку.
Если вы хотите включить в строку символ кавычки любого типа, самый простой способ - разделить строку другим типом.Если строка должна содержать одинарную кавычку, разделите ее двойными кавычками и наоборот:
>>>
>>> print («Эта строка содержит символ одинарной кавычки (').») Эта строка содержит одинарную кавычку ('). >>> print ('Эта строка содержит символ двойной кавычки (").') Эта строка содержит символ двойной кавычки (").
escape-последовательностей в строках
Иногда требуется, чтобы Python по-разному интерпретировал символ или последовательность символов в строке.Это может произойти одним из двух способов:
- Вы можете захотеть подавить специальную интерпретацию, которую обычно дают определенные символы в строке.
- Вы можете применить специальную интерпретацию к символам в строке, которые обычно воспринимаются буквально.
Это можно сделать с помощью символа обратной косой черты (
\
). Символ обратной косой черты в строке указывает на то, что один или несколько следующих за ним символов должны обрабатываться особым образом.(Это называется escape-последовательностью, потому что обратная косая черта заставляет последующую последовательность символов «ускользать» от своего обычного значения.)Давайте посмотрим, как это работает.
Подавление значения специального символа
Вы уже видели проблемы, с которыми вы можете столкнуться, когда пытаетесь включить символы кавычек в строку. Если строка разделена одинарными кавычками, вы не можете напрямую указать символ одинарной кавычки как часть строки, потому что для этой строки одинарная кавычка имеет особое значение - она завершает строку:
>>>
>>> print ('Эта строка содержит одинарную кавычку (').') SyntaxError: недопустимый синтаксис
Указание обратной косой черты перед символом кавычки в строке «экранирует» ее и заставляет Python подавлять его обычное особое значение. Затем он интерпретируется просто как буквальный символ одинарной кавычки:
>>>
>>> print ('Эта строка содержит символ одинарной кавычки (\'). ') Эта строка содержит одинарную кавычку (').
То же самое работает и со строкой, разделенной двойными кавычками:
>>>
>>> print ("Эта строка содержит символ двойной кавычки (\").") Эта строка содержит символ двойной кавычки (").
Ниже приводится таблица управляющих последовательностей, которые заставляют Python подавлять обычную специальную интерпретацию символа в строке:
Побег
ПоследовательностьОбычная интерпретация
символов после обратной косой чертыИнтерпретация «сбежавших» \ '
Завершает строку открывающим разделителем в одинарных кавычках Буквальная одинарная кавычка ( '
) символ\ "
Завершает строку открывающим разделителем в виде двойных кавычек Буквальная двойная кавычка ( "
) символ\ новая строка
Завершает входную строку Новая строка игнорируется \
- вводит escape-последовательность Буквальная обратная косая черта ( \
) символОбычно символ новой строки завершает ввод строки.Таким образом, нажатие Enter в середине строки заставит Python думать, что он неполный:
>>>
>>> print ('a SyntaxError: EOL при сканировании строкового литерала
Чтобы разбить строку на более чем одну строку, используйте обратную косую черту перед каждой новой строкой, и новые строки будут игнорироваться:
>>>
>>> print ('a \ ... б \ ... в ') abc
Чтобы включить буквальную обратную косую черту в строку, экранируйте ее обратной косой чертой:
>>>
>>> print ('foo \\ bar') foo \ bar
Применение специального значения к символам
Затем предположим, что вам нужно создать строку, содержащую символ табуляции.Некоторые текстовые редакторы позволяют вставлять символ табуляции прямо в код. Но многие программисты считают это плохой практикой по нескольким причинам:
- Компьютер может различать символ табуляции и последовательность пробелов, но вы не можете. Для человека, читающего код, символы табуляции и пробела визуально неразличимы.
- Некоторые текстовые редакторы настроены на автоматическое удаление символов табуляции путем расширения их до необходимого количества пробелов.
- Некоторые среды Python REPL не вставляют вкладки в код.
В Python (и почти на всех других распространенных компьютерных языках) символ табуляции может быть указан с помощью escape-последовательности
\ t
:>>>
>>> print ('foo \ tbar') foo bar
Управляющая последовательность
\ t
приводит к тому, что символt
теряет свое обычное значение, буквальное значениеt
. Вместо этого комбинация интерпретируется как символ табуляции.Вот список escape-последовательностей, которые заставляют Python применять особое значение вместо буквальной интерпретации:
Последовательность побега Интерпретация «сбежавших» \ a
ASCII Bell ( BEL
) символ\ б
ASCII Backspace ( BS
) символ\ f
ASCII Formfeed ( FF
) символ\ п
Символ перевода строки ASCII ( LF
)\ N {<имя>}
Символ из базы данных Unicode с данным <имя>
\ r
Символ возврата каретки ASCII ( CR
)\ т
ASCII горизонтальная табуляция ( TAB
) символ\ uxxxx
Символ Юникода с 16-битным шестнадцатеричным значением xxxx
\ Uxxxxxxxx
Символ Юникода с 32-битным шестнадцатеричным значением xxxxxxxx
\ v
ASCII вертикальная табуляция ( VT
) символ\ ooo
Знак с восьмеричным числом ооо
\ xhh
Символ с шестнадцатеричным значением hh
Примеры:
>>>
>>> print ("a \ tb") а б >>> print ("a \ 141 \ x61") ааа >>> print ("a \ nb") а б >>> print ('\ u2192 \ N {стрелка вправо}') → →
Этот тип escape-последовательности обычно используется для вставки символов, которые нелегко генерировать с клавиатуры или которые трудно читать или печатать.
Сырые струны
Необработанному строковому литералу предшествует
r
илиR
, который указывает, что escape-последовательности в связанной строке не транслируются. В строке остается символ обратной косой черты:>>>
>>> print ('foo \ nbar') фу бар >>> print (r'foo \ nbar ') foo \ nbar >>> print ('foo \\ bar') foo \ bar >>> print (R'foo \\ bar ') foo \\ бар
Струны с тройными кавычками
В Python есть еще один способ разграничения строк.Строки в тройных кавычках разделяются совпадающими группами из трех одинарных или трех двойных кавычек. Escape-последовательности по-прежнему работают в строках, заключенных в тройные кавычки, но одинарные кавычки, двойные кавычки и символы новой строки могут быть включены без их экранирования. Это обеспечивает удобный способ создания строки как с одинарными, так и с двойными кавычками:
>>>
>>> print ('' 'Эта строка состоит из одинарной (') и двойной (") кавычек. '' ') Эта строка состоит из одинарных (') и двойных (") кавычек.
Поскольку новые строки могут быть включены без их экранирования, это также позволяет использовать многострочные строки:
>>>
>>> print ("" "Это строка, которая охватывает через несколько строк "" ") Это строка, которая охватывает через несколько строк
В предстоящем руководстве по структуре программы Python вы увидите, как можно использовать строки в тройных кавычках для добавления пояснительного комментария к коду Python.
Логический тип, логический контекст и «истинность»
Python 3 предоставляет логический тип данных. Объекты типа Boolean могут иметь одно из двух значений:
True
илиFalse
:>>>
>>> тип (True) <класс 'bool'> >>> type (Ложь) <класс 'bool'>
Как вы увидите в следующих руководствах, выражения в Python часто оцениваются в логическом контексте, что означает, что они интерпретируются как представление истины или лжи.Значение, истинное в логическом контексте, иногда называют «истинным», а значение, которое ложно в логическом контексте, считается «ложным». (Вы также можете встретить слово «ложь», написанное как «ложь».)
«Правдивость» объекта логического типа очевидна: логические объекты, которые равны
True
, являются истинными (истинными), а те, которые равныFalse
, являются ложными (ложными). Но не-логические объекты также могут быть оценены в логическом контексте и определены как истинные или ложные.Вы узнаете больше об оценке объектов в логическом контексте, когда столкнетесь с логическими операторами в предстоящем руководстве по операторам и выражениям в Python.
Встроенные функции
Интерпретатор Python поддерживает множество встроенных функций: шестьдесят восемь, начиная с Python 3.6. Вы рассмотрите многие из них в следующих обсуждениях, поскольку они возникают в контексте.
А пока следует краткий обзор, чтобы дать представление о том, что доступно. См. Документацию Python по встроенным функциям для получения более подробной информации. Многие из следующих описаний относятся к темам и концепциям, которые будут обсуждаться в будущих руководствах.
Математика
Функция Описание абс. ()
Возвращает абсолютное значение числа .
divmod ()
Возвращает частное и остаток от целочисленного деления. .
макс. ()
Возвращает наибольший из заданных аргументов или элементов в итерации. мин ()
Возвращает наименьший из заданных аргументов или элементов в итерации. pow ()
Возводит число в степень круглый ()
Округляет значение с плавающей запятой сумма ()
Суммирует элементы итерации Преобразование типа
Функция Описание ascii ()
Возвращает строку, содержащую печатное представление объекта бункер ()
Преобразует целое число в двоичную строку булев ()
Преобразует аргумент в логическое значение chr ()
Возвращает строковое представление символа, заданного целочисленным аргументом комплекс ()
Возвращает комплексное число, построенное из аргументов поплавок ()
Возвращает объект с плавающей запятой, состоящий из числа или строки шестигранник ()
Преобразует целое число в шестнадцатеричную строку внутр ()
Возвращает целочисленный объект, состоящий из числа или строки окт. ()
Преобразует целое число в восьмеричную строку порядковый номер ()
Возвращает целочисленное представление символа представитель ()
Возвращает строку, содержащую печатное представление объекта ул. ()
Возвращает строковую версию объекта тип ()
Возвращает тип объекта или создает объект нового типа Итераторы и итераторы
Функция Описание все ()
Возвращает Истина
, если все элементы итерации истиннылюбой ()
Возвращает Истина
, если какие-либо элементы итерации верныперечислить ()
Возвращает список кортежей, содержащих индексы и значения из итерируемого фильтр ()
Фильтрует элементы из итеративного iter ()
Возвращает объект-итератор лин ()
Возвращает длину объекта карта ()
Применяет функцию к каждому элементу итерации следующая ()
Извлекает следующий элемент из итератора диапазон ()
Создает диапазон целочисленных значений обратное ()
Возвращает обратный итератор ломтик ()
Возвращает фрагмент
объектотсортировано ()
Возвращает отсортированный список из итерируемого молния ()
Создает итератор, который объединяет элементы из итераций Составной тип данных
Функция Описание bytearray ()
Создает и возвращает объект массива байтов байтов ()
Создает и возвращает объект байтов
(аналогbytearray
, но неизменяемый)дикт ()
Создает dict
объектморозильник ()
Создает frozenset
объектсписок ()
Создает список объект ()
Создает новый безликий объект комплект ()
Создает набор кортеж ()
Создает кортеж Классы, атрибуты и наследование
Функция Описание classmethod ()
Возвращает метод класса для функции delattr ()
Удаляет атрибут из объекта getattr ()
Возвращает значение именованного атрибута объекта hasattr ()
Возвращает Истина
, если объект имеет заданный атрибутisinstance ()
Определяет, является ли объект экземпляром данного класса issubclass ()
Определяет, является ли класс подклассом данного класса недвижимость ()
Возвращает значение свойства класса setattr ()
Устанавливает значение именованного атрибута объекта супер ()
Возвращает прокси-объект, который делегирует вызовы методов родительскому или одноуровневому классу Вход / выход
Функция Описание формат ()
Преобразует значение в форматированное представление вход ()
Считывает ввод с консоли открытый ()
Открывает файл и возвращает объект файла печать ()
Печать в текстовый поток или консоль Переменные, ссылки и область действия
Функция Описание директ ()
Возвращает список имен в текущей локальной области или список атрибутов объекта глобальные ()
Возвращает словарь, представляющий текущую глобальную таблицу символов id ()
Возвращает идентификатор объекта местные жители ()
Обновляет и возвращает словарь, представляющий текущую локальную таблицу символов варс ()
Возвращает __dict__
атрибут для модуля, класса или объектаРазное
Функция Описание звонок ()
Возвращает Истина
, если объект кажется вызываемымкомпиляция ()
Компилирует исходный код в код или объект AST eval ()
Вычисляет выражение Python exec ()
Реализует динамическое выполнение кода Python хеш ()
Возвращает хеш-значение объекта справка ()
Вызывает встроенную справочную систему просмотр памяти ()
Возвращает объект просмотра памяти статический метод ()
Возвращает статический метод для функции __импорт __ ()
Вызывается оператором импорта Заключение
В этом руководстве вы узнали о встроенных типах данных , функциях и , которые предоставляет Python.
Все приведенные до сих пор примеры манипулировали и отображали только постоянные значения. В большинстве программ вы обычно хотите создавать объекты, значение которых изменяется по мере выполнения программы.
Перейдите к следующему руководству, чтобы узнать о переменных Python .
Пройдите тест: Проверьте свои знания с помощью нашей интерактивной викторины «Основные типы данных в Python». По завершении вы получите оценку, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройти тест »
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python.Просмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Основные типы данных в Python
Почему Swift не может добавить Double к Int?
Пол Хадсон @twostraws
Обновлено для Xcode 12.5
Swift имеет несколько способов хранения данных, таких как строки, логические значения и массивы. Но когда дело доходит до работы с числами, у него есть несколько очень специфических типов, в том числе
Double
,Float
иInt
- их намного больше, но они наиболее часто используются.Swift имеет эти разные числовые типы, потому что они по-разному хранят свои данные. Например,
Double
иInt
занимают одинаковый объем памяти для хранения своего числа, ноInt
хранит только целые числа, тогда какDouble
может сохранять значения после десятичного разряда.Итак, на простейшем уровне вы можете увидеть, что добавление
Double
кInt
небезопасно, потому чтоDouble
может хранить вещи, которые не может хранитьInt
, и это будет потеряно в результирующем целом числе.Теперь вы можете подумать , а затем : «А как насчет того, чтобы, когда мы добавим
Int
кDouble
, мы вернем новыйDouble
, который может хранить все данные ?» И это отличный вопрос!Проблема в том, что, хотя
Double
использует тот же объем памяти для хранения своего значения, что иInt
, способ , которым хранит свои данные, немного нечеткий - он действительно имеет большую точность с меньшими числами, но все более нечеткой когда начинаешь работать с большими числами.На самом деле, есть определенные числа, которыеDouble
даже не может удерживать, поэтому вместо этого он хранит немного другое значение.К счастью, Swift даже предупреждает нас, когда это происходит. Например, попробуйте этот код:
let значение: Double =
000000000001
Когда вы его создаете, Swift показывает предупреждение: «
000000000001» нельзя точно представить как «Double»; он становится "
000000000000".
Целые числа теряют возможность хранить дробные значения, но они получают возможность хранить точных значений.Это означает, что следующий код не выдаст предупреждения, потому что число может быть сохранено точно:
let значение: Int =
000000000001
Таким образом, небезопасно добавлять
Double
кInt
, потому что мы теряем любые числа после десятичной точки, и небезопасно добавлятьInt
кDouble
, потому что мы теряем некоторые точность.На этом этапе у вас может возникнуть третий вопрос: как насчет Swift позволяет нам добавлять
Int
кDouble
, только если он уверен, что полученное значение можно безопасно сохранить? В конце концов, нам очень редко приходится работать с числами размером до000000000001.
И это правда, но проблема в том, что Swift не может сказать, какими будут ваши числа, когда вы создадите свой код, поэтому мы возвращаемся к проблеме безопасности - конечно, вы можете работать с безопасными числами большую часть времени. , но Swift специально разработан, чтобы не рисковать даже в непредвиденных случаях.
В результате всего этого Swift откажется от автоматического преобразования между различными числовыми типами - нельзя складывать
Int
иDouble
, нельзя умножатьFloat
иInt
, и так далее.Спонсируйте взлом со Swift и войдите в крупнейшее в мире сообщество Swift!
Примитивные типы данных Java - HowToDoInJava
Узнайте обо всех восьми примитивных типах данных в Java , их размерах памяти, значениях по умолчанию и диапазоне максимального и минимального значений.
Примитивные типы данных предопределены языком Java и названы зарезервированными ключевыми словами. Давайте посмотрим на каждый примитивный тип данных на изображении ниже.
Примитивные типы данных в java
1.Целочисленные типы данных Java
Целочисленный тип данных - это числовой тип данных, значения которого относятся к целочисленному типу .
Java предлагает пять интегральных типов данных :
1.1.
int
тип- Тип данных
int
- это примитивный тип данных Java с 32-битным знаком . Переменная типа данныхint
занимает 32 бита памяти . - Допустимый диапазон: от -2 147 483 648 до 2 147 483 647 (от -2 31 до 2 31 - 1).
- Все целые числа в этом диапазоне известны как целочисленные литералы (или целочисленные константы). Например, 10, -200, 0, 30, 19 и т. Д. Являются целочисленными литералами int.
Целочисленный литерал может быть назначен переменной
int
, например,counter
, например:int counter = 21;
1.1.1. Целочисленный класс-оболочка
В Java есть класс-оболочка с именем
Integer
, который определяет две константы для представления максимального и минимального значений для типа данных int,Integer.MAX_VALUE
иЦелое число.MIN_VALUE
. Это объектное представление значения типа int.int max = целое.MAX_VALUE; // Присваивает максимальное значение int для max int min = Целое.MIN_VALUE; // Присваивает минимальное значение int для min
1.2.
long
type- Тип данных long - это 64-битный подписанный Java-примитивный тип данных .
- Используется, когда результат вычислений целых чисел может превышать диапазон типа данных int.
- Его диапазон от -2 63 до 2 63 - 1.
- Все целые числа в диапазоне long называются целочисленными литералами типа long .
Целочисленный литерал типа long всегда заканчивается буквой «L» (или строчной буквой «l»).
длинное число1 = 0L; длинное число2 = 401л; длинный mum3 = -3556L;
1.2.1. Приведение типов
Даже если значение, хранящееся в переменной
long
, находится в пределах диапазона типа данныхint
, присвоение от long к int не допускается без явного приведения типа , как показано в следующий пример:int num1 = 5; длинное число2 = 25л; // Ошибка времени компиляции.Даже если num2 имеет значение 25, которое находится в диапазоне int. число1 = число2;
Если вы хотите присвоить значение переменной
long
переменнойint
, вы должны явно указать этот факт в своем коде , чтобы Java была уверена, что вы знаете о возможном переполнении данных. Вы делаете это, используя "cast" в Java, например:длинное число1 = (целое число) число2; // Теперь все в порядке из-за приведения "(int)"
Записывая
(int) num2
, вы инструктируете Java обрабатывать значение, хранящееся вnum2
, как int.Во время выполнения Java будет использовать только 32 младших битаnum2
и присвоить значение, хранящееся в этих 32 битах,num1
. Еслиnum2
имеет значение, выходящее за пределы диапазона типа данных int, вы не получите такое же значение вnum1
, и это приведет к потере данных .1.2.2. Класс Long Wrapper
В Java есть класс
Long
(обратите внимание на верхний регистр L в Long), который определяет две константы для представления максимального и минимального значений типа данных long,Long.MAX_VALUE
иLong.MIN_VALUE
.long max = Long.MAX_VALUE; long min = Long.MIN_VALUE;
1.3.
байт
тип- Тип данных байт - это примитивный целочисленный тип данных со знаком 8-битный знак Java .
- Его диапазон от -128 до 127 (от -27 до 27-1). Это наименьший целочисленный тип данных , доступный в Java.
- В отличие от
int
иlong
литералов, здесь нет байтовых литералов. - Однако вы можете назначить любой литерал int, попадающий в диапазон байтов, байтовой переменной.
байт b1 = 125; байт b2 = -11;
1.3.1. Приведение типов
Если вы назначаете литерал
int
для-байтовой переменной
и значение выходит за пределы диапазона байтового типа данных, Java генерирует ошибку компилятора. Следующий фрагмент кода вызовет ошибку компилятора:// Ошибка. 150 является внутренним литералом за пределами от -128 до 127 байт b3 = 150;
Java не позволяет вам присвоить значение переменной типа данных более высокого диапазона переменной типа данных более низкого диапазона, потому что существует возможная потеря точности при выполнении такого присвоения.Чтобы сделать такое присваивание от int к байту, вы должны использовать приведение, как вы это делали в случае присваивания long-to-int.
b1 = (байт) num1; // Ok
1.3.2. Byte Wrapper Class
Java имеет класс
Byte
(обратите внимание на верхний регистр B в Byte), который определяет две константы для представления максимального и минимального значений байтового типа данных:Byte.MAX_VALUE
иByte.MIN_VALUE
.макс. байт = Byte.MAX_VALUE; байт min = Byte.MIN_VALUE;
1.4.
short
typeshort
data type - это 16-битный подписанный Java-примитивный целочисленный тип данных. Его диапазон составляет от -32768 до 32767 (или от -215 до 215-1).- В отличие от целых и длинных литералов, здесь нет коротких литералов.
- Однако вы можете назначить любой литерал int, который попадает в диапазон short (от -32768 до 32767), переменной short.
короткий s1 = 12905; // Ok короткий s2 = -11890; // Ok
Значение байтовой переменной всегда можно присвоить переменной типа short, потому что диапазон байтового типа данных попадает в диапазон короткого типа данных.Все остальные правила присвоения значения переменной типа int или long переменной типа short такие же, как и для переменной byte.
1.4.1. Short Wrapper Class
В Java есть класс
Short
(обратите внимание на верхний регистр S в Short), который определяет две константы для представления максимального и минимального значений типа данных short:Short.MAX_VALUE
иShort.MIN_VALUE
.short max = Short.MAX_VALUE; short min = Short.MIN_VALUE;
1.5.
char
тип данных- Тип данных char - это 16-битный беззнаковый тип данных Java .
- Представляет символ Unicode .
- Обратите внимание, что char - это беззнаковый тип данных. Следовательно, переменная типа char не может иметь отрицательное значение.
- Диапазон типа данных char составляет от 0 до 65535, что совпадает с диапазоном набора Unicode.
- Символьный литерал представляет значение типа данных char.
char c1 = 'А'; char c2 = 'L'; char c3 = '5'; char c4 = '/';
1.5.1. Управляющие последовательности символов
Символьный литерал также может быть выражен как escape-последовательность символов . Управляющая последовательность символов начинается с обратной косой черты, сразу за которой следует символ, и оба символа заключаются в одинарные кавычки.
Существует восемь предопределенных управляющих последовательностей символов , как указано ниже:
Последовательность escape-символов Описание '\ n' Перевод строки '\ r' Возврат каретки '\ f' A подача формы '\ b' A backspace '\ t' A tab '\\' A обратная косая черта '\ ”' Двойная кавычка '\” Одинарная кавычка В Java это только восьмисимвольные escape-последовательности.Вы не можете определить escape-последовательности для своих персонажей.
1.5.2. Управляющая последовательность Unicode
Символьный литерал также может быть выражен как escape-последовательность Unicode в форме
'\ uxxxx'
, Здесь \ u (обратная косая черта, сразу за которой следует строчная u) обозначает начало escape-последовательности Unicode. последовательность, а xxxx представляет ровно четыре шестнадцатеричных цифры.char c1 = 'А'; char c2 = '\ u0041'; // То же, что c2 = 'A'
2. Типы данных Java с плавающей запятой
Число с плавающей запятой, которое содержит дробную часть , известно как действительное число , например 3.25, 0,49, -9,19 и т. Д.
Как числа хранятся в памяти
Когда действительное число преобразуется в его двоичное представление, компьютер также должен сохранять позицию десятичной точки в числе. Есть две стратегии хранения действительного числа в памяти компьютера.
- Формат чисел с фиксированной запятой - Храните только двоичное представление числа и предполагайте, что всегда есть фиксированное количество цифр до и после точки. Точка называется десятичной точкой в десятичном представлении числа и двоичной точкой в двоичном представлении.Тип представления, в котором положение точки всегда фиксируется числом, известен как числовой формат с фиксированной точкой.
- Формат чисел с плавающей запятой - Сохранение двоичного представления действительного числа и положения точки в действительном числе. Поскольку количество цифр до и после точки может варьироваться в этом виде представления действительного числа, мы говорим, что точка может плавать. Такой вид представления называется форматом с плавающей запятой.
Представления с плавающей запятой на медленнее и менее точны по сравнению с представлениями с фиксированной запятой. Однако представления с плавающей запятой могут обрабатывать больший диапазон чисел с той же компьютерной памятью по сравнению с представлениями с фиксированной запятой.
Java поддерживает числовой формат с плавающей запятой.
IEEE-754 32-битные числа с плавающей запятой одинарной точности
В Java есть два числовых типа данных с плавающей запятой: float и double .
2.1.
float
typeТип данных float использует 32 бита для хранения числа с плавающей запятой в стандартном формате IEEE 754 ( число с плавающей запятой одинарной точности ). Он может представлять собой действительное число от 1,4 x 10 -45 до 3,4 x 10 38 (приблизительно) по величине. В диапазон входит только величина. Это могло быть положительно или отрицательно.
Все действительные числа, заканчивающиеся на «f» или «F», называются литералами с плавающей запятой .
поплавок f1 = 8F; float f2 = 8.F; float f3 = 8.0F;
2.1.1. Положительная и отрицательная бесконечность
Тип данных float определяет две бесконечности: положительную бесконечность и отрицательную бесконечность. Например, результатом деления
2,5F
на0,0F
является положительная бесконечность с плавающей запятой, тогда как результатом деления2,5F
на-0,0F
является отрицательная бесконечность с плавающей запятой.2.1.2. NaN (Not-a-Number)
Результаты некоторых операций с плавающей точкой не определены.Эти результаты представлены специальным значением типа данных с плавающей запятой, называемым NaN (Not-a-Number).
Класс Float
определяет три константы, которые представляют положительную бесконечность, отрицательную бесконечность и NaN типа данных с плавающей запятой. Есть еще две константы, которые представляют максимальное и минимальное (больше нуля) значения с плавающей запятой, которые могут быть сохранены в переменной с плавающей запятой.Float.POSITIVE_INFINITY - положительная бесконечность типа float. Float.NEGATIVE_INFINITY - отрицательная бесконечность типа float.Float.NaN - Не число типа float. Float.MAX_VALUE - наибольшее положительное значение, которое может быть представлено в переменной с плавающей запятой. Float.MIN_VALUE - наименьшее положительное значение больше нуля, которое может быть представлено в переменной с плавающей запятой.
Обратите внимание, что значение всех целочисленных типов (int, long, byte, short и char) может быть присвоено переменной типа данных с плавающей запятой без использования явного приведения, НО значение с плавающей запятой должно быть приведено до того, как оно будет преобразовано. присваивается переменной любого целого типа данных int, long, byte, short или char.
2.2.
double
typeТип данных double использует 64 бита для хранения числа с плавающей запятой в «стандартном формате IEEE 754». Число с плавающей запятой, представленное в 64-битном формате в соответствии со стандартом IEEE 754, также известно как число с плавающей запятой двойной точности .
Все действительные числа называются двойными литералами . Двойной литерал может необязательно оканчиваться на «d» или «D», например, 19.27d. Однако суффикс d или D в двойных литералах необязателен.То есть и 19.27, и 19.27d представляют один и тот же двойной литерал.
двойной d1 = 8D двойной d2 = 8 .; двойной d3 = 8,0; двойной d4 = 8.D;
Подобно типу данных float, тип данных double определяет максимальное, минимальное, две бесконечности и значения NaN.
Double.POSITIVE_INFINITY - положительная бесконечность типа double. Double.NEGATIVE_INFINITY - отрицательная бесконечность типа double. Double.NaN - Не число типа double. Double.MAX_VALUE - наибольшее положительное значение, которое может быть представлено в переменной типа double.Double.MIN_VALUE - наименьшее положительное значение больше нуля, которое может быть представлено в переменной типа double.
3. Логический тип данных Java
3.1.
boolean
typeЛогический тип данных имеет только два допустимых значения: true и false . Эти два значения называются логическими литералами . Вы можете использовать логические литералы как
логическое сделано; // Объявляет логическую переменную с именем done сделано = правда; // Присваивает истину сделанному
Следует отметить один важный момент: логическая переменная не может быть приведена к любому другому типу данных и наоборот .Java не определяет размер логического типа данных. Его размер оставлен на усмотрение реализации JVM. Обычно значение логического типа данных хранится внутри в байтах.
Это все для 8 примитивных типов данных, доступных в java .
Счастливого обучения !!
MySQL :: Справочное руководство MySQL 8.0 :: 11.1.4 Типы с плавающей запятой (приблизительное значение)
11.1.4 Типы с плавающей запятой (приблизительное значение) - FLOAT, DOUBLE
Типы
FLOAT
иDOUBLE
представляют собой приблизительные числовые значения данных.MySQL использует четыре байта
для значений с одинарной точностью и восемь байтов для значений с двойной точностью
значения.Для
FLOAT
стандарт SQL разрешает
необязательное указание точности (но не диапазона
экспонента) в битах после ключевого слова
FLOAT
в скобках; ; то есть,
ПОПЛАВКА (
.стр.
)
MySQL также поддерживает эту необязательную спецификацию точности, но
значение точности в
ПОПЛАВОК (
стр.
)
используется только для определения размера хранилища.Точность от 0 до 23
приводит к 4-байтовой одинарной точностиFLOAT
столбец. Точность от 24 до 53 приводит к 8-байтовому
столбец двойной точностиDOUBLE
.MySQL допускает нестандартный синтаксис:
ПОПЛАВОК (
M
,D
)
или же
НАСТОЯЩЕЕ (
M
,D
)
илиДВОЙНОЙ
.Здесь,
ТОЧНОСТЬ (M
,D
)
(
M
,D
)
означает, что значения могут быть сохранены до
M
Всего цифр, из них
D
цифры могут быть после десятичной дроби
точка. Например, столбец, определенный как
FLOAT (7,4)
отображается как
-999,9999
. MySQL выполняет округление, когда
сохранение значений, поэтому, если вы вставите999.00009
в столбецFLOAT (7,4)
, приблизительный
результат -999.0001
.Начиная с MySQL 8.0.17 нестандартный
ПОПЛАВОК (
M
,D
)
и
ДВОЙНОЙ (
M
,D
)
синтаксис устарел, и вы должны ожидать, что он будет поддерживаться
удален в будущей версии MySQL.Поскольку значения с плавающей запятой являются приблизительными и не хранятся как
точные значения, попытки рассматривать их как точные при сравнении могут
привести к проблемам.Они также зависят от платформы или
зависимости реализации. Для получения дополнительной информации см.
Раздел B.3.4.8, «Проблемы со значениями с плавающей запятой»Для максимальной переносимости код, требующий хранения приблизительного
числовые значения данных должны использоватьFLOAT
или
ДВОЙНАЯ ТОЧНОСТЬ
без спецификации
точность или количество цифр.PHP: Числа с плавающей запятой - Руководство
Числа с плавающей запятой
Числа с плавающей запятой (также известные как «числа с плавающей запятой», «двойные» или «действительные числа»).
можно указать с помощью любого из следующих синтаксисов:
php
$ a = 1.234;
$ b = 1,2e3;
$ c = 7E-10;
$ d = 1_234,567; // начиная с PHP 7.4.0
?>Формально, начиная с PHP 7.4.0 (ранее подчеркивание не разрешалось):
LNUM [0-9] + (_ [0-9] +) * DNUM ([0-9] * (_ [0-9] +) * [\.] {LNUM}) | ({LNUM} [\.] [0-9] * (_ [0-9] +) *) EXPONENT_DNUM (({LNUM} | {DNUM}) [eE] [+ -]? {LNUM})
Размер поплавка зависит от платформы, но не более 1,8e308.
с точностью примерно до 14 десятичных цифр является общим значением (64-битный стандарт IEEE
формат).Предупреждение
Числа с плавающей запятой имеют ограниченную точность. Хотя это зависит от
системы, PHP обычно использует формат двойной точности IEEE 754, который
дают максимальную относительную ошибку из-за округления в порядке 1.11e-16.
Неэлементарные арифметические операции могут давать большие ошибки и, конечно же,
распространение ошибок необходимо учитывать, когда выполняются несколько операций.
смешанный.Кроме того, рациональные числа, которые точно могут быть представлены как плавающие
номера точек в базе 10, например0.1
или
0,7
, не имеют точного представления как плавающие
числа точек в базе 2, которая используется внутри компании, независимо от размера
мантисса. Следовательно, они не могут быть преобразованы во внутренние двоичные файлы.
аналоги без небольшой потери точности. Это может привести к путанице
результаты: например,этаж ((0,1 + 0,7) * 10)
обычно
вернуть7
вместо ожидаемого8
,
так как внутреннее представление будет чем-то вроде
7.99999999999999 ...
.Поэтому никогда не доверяйте результату чисел с плавающей запятой до последней цифры и не сравнивайте
числа с плавающей запятой непосредственно для равенства. Если более высокая точность
необходимо, математические функции произвольной точности
и функции gmp доступны."Простое" объяснение см. В »руководстве по операциям с плавающей запятой.
он также озаглавлен "Почему мои числа не складываются?"Преобразование в число с плавающей запятой
Из струн
Если строка
числовой
или ведущее число, тогда оно будет разрешено в
соответствующее значение с плавающей запятой, иначе оно преобразуется в ноль
(0
).Из других типов
Для значений других типов преобразование выполняется путем преобразования
значение сначала в int, а затем в float. Видеть
Преобразование в целое число
для дополнительной информации.Примечание :
Поскольку определенные типы имеют неопределенное поведение при преобразовании в
int, то же самое происходит при преобразовании в
плавать.Сравнение поплавков
Как отмечалось в предупреждении выше, проверка значений с плавающей запятой на равенство
проблематично из-за того, как они представлены внутри.Тем не мение,
существуют способы сравнения значений с плавающей запятой, которые позволяют обойти
эти ограничения.Чтобы проверить значения с плавающей запятой на равенство, верхняя граница относительного
ошибка из-за округления. Это значение известно как машинный эпсилон,
или единичное округление, и является наименьшей допустимой разницей в вычислениях.$ a и $ b равны 5 цифрам
точность.
php
$ a = 1.23456789;
$ b = 1,23456780;
$ эпсилон = 0,00001;if (
abs ($ a- $ b) <$ epsilon) {
echo "true";
}
?>NaN
Некоторые числовые операции могут привести к значению, представленному константой
НАН
. Этот результат представляет собой неопределенный или
непредставимое значение в вычислениях с плавающей запятой. Любой свободный или строгий
сравнение этого значения с любым другим значением, включая его самого, но кромеистинного
, будет
имеют результатложный
.Поскольку
NAN
представляет любое количество различных значений,
NAN
не следует сравнивать с другими значениями, включая
сам, и вместо этого должен быть проверен на использование is_nan ().