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

При помощи какой функции можно преобразовать значение вещественного типа в целочисленное

  • автор:

При помощи какой функции можно преобразовать значение вещественного типа в целочисленное

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

byte a = 4; int b = a + 70;

Результатом операции вполне справедливо является число 74, как и ожидается.

Но теперь попробуем применить сложение к двум объектам типа byte :

byte a = 4; byte b = a + 70; // ошибка

Здесь поменялся только тип переменной, которая получает результат сложения — с int на byte. Однако при попытке скомпилировать программу мы получим ошибку на этапе компиляции. И если мы работаем в Visual Studio, среда подчеркнет вторую строку красной волнистой линией, указывая, что в ней ошибка.

При операциях мы должны учитывать диапазон значений, которые может хранить тот или иной тип. Но в данном случае число 74, которое мы ожидаем получить, вполне укладывается в диапазон значений типа byte, тем не менее мы получаем ошибку.

Дело в том, что операция сложения (да и вычитания) возвращает значение типа int, если в операции участвуют целочисленные типы данных с разрядностью меньше или равно int (то есть типы byte, short, int). Поэтому результатом операции a + 70 будет объект, который имеет длину в памяти 4 байта. Затем этот объект мы пытаемся присвоить переменной b, которая имеет тип byte и в памяти занимает 1 байт.

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

(тип_данных_в_который_надо_преобразовать)значение_для_преобразования;

Так, изменим предыдущий пример, применив операцию преобразования типов:

byte a = 4; byte b = (byte)(a + 70);

Сужающие и расширяющие преобразования

Преобразования могут быть сужающие (narrowing) и расширяющие (widening). Расширяющие преобразования расширяют размер объекта в памяти. Например:

byte a = 4; // 0000100 ushort b = a; // 000000000000100

В данном случае переменной типа ushort присваивается значение типа byte. Тип byte занимает 1 байт (8 бит), и значение переменной a в двоичном виде можно представить как:

00000100

Значение типа ushort занимает 2 байта (16 бит). И при присвоении переменной b значение переменной a расширяется до 2 байт

0000000000000100

То есть значение, которое занимает 8 бит, расширяется до 16 бит.

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

ushort a = 4; byte b = (byte) a;

Здесь переменной b, которая занимает 8 бит, присваивается значение ushort, которое занимает 16 бит. То есть из 0000000000000100 получаем 00000100 . Таким образом, значение сужается с 16 бит (2 байт) до 8 бит (1 байт).

Явные и неявные преобразования

Неявные преобразования

В случае с расширяющими преобразованиями компилятор за нас выполнял все преобразования данных, то есть преобразования были неявными ( implicit conversion ). Такие преобразования не вызывают каких-то затруднений. Тем не менее стоит сказать пару слов об общей механике подобных преобразований.

Если производится преобразование от безнакового типа меньшей разрядности к безнаковому типу большой разрядности, то добавляются дополнительные биты, которые имеют значени 0. Это называется дополнение нулями или zero extension.

byte a = 4; // 0000100 ushort b = a; // 000000000000100

Если производится преобразование к знаковому типу, то битовое представление дополняется нулями, если число положительное, и единицами, если число отрицательное. Последний разряд числа содержит знаковый бит — 0 для положительных и 1 для отрицательных чисел. При расширении в добавленные разряды компируется знаковый бит.

Рассмотрим преобразование положительного числа:

sbyte a = 4; // 0000100 short b = a; // 000000000000100

Sing bit in conversions in c#

Преобразование отрицательного числа:

sbyte a = -4; // 1111100 short b = a; // 111111111111100

Sing bit negative number in conversions in c#

Явные преобразования

При явных преобразованиях ( explicit conversion ) мы сами должны применить операцию преобразования (операция () ). Суть операции преобразования типов состоит в том, что перед значением указывается в скобках тип, к которому надо привести данное значение:

int a = 4; int b = 6; byte c = (byte)(a+b);

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

byte -> short -> int -> long -> decimal

short -> float -> double

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

В какие типы безопасно преобразуется

short, ushort, int, uint, long, ulong, float, double, decimal

short, int, long, float, double, decimal

int, long, float, double, decimal

int, uint, long, ulong, float, double, decimal

long, float, double, decimal

long, ulong, float, double, decimal

float, double, decimal

float, double, decimal

ushort, int, uint, long, ulong, float, double, decimal

В остальных случаях следует использовать явные преобразования типов.

Также следует отметить, что несмотря на то, что и double, и decimal могут хранить дробные данные, а decimal имеет большую разрядность, чем double, но все равно значение double нужно явно приводить к типу decimal:

double a = 4.0; decimal b = (decimal)a;

Потеря данных и ключевое слово checked

Рассмотрим другую ситуацию, что будет, например, в следующем случае:

int a = 33; int b = 600; byte c = (byte)(a+b); Console.WriteLine(c); // 121

Результатом будет число 121, так число 633 не попадает в допустимый диапазон для типа byte, и старшие биты будут усекаться. В итоге получится число 121. Поэтому при преобразованиях надо это учитывать. И мы в данном случае можем либо взять такие числа a и b, которые в сумме дадут число не больше 255, либо мы можем выбрать вместо byte другой тип данных, например, int.

Однако ситуации разные могут быть. Мы можем точно не знать, какие значения будут иметь числа a и b. И чтобы избежать подобных ситуаций, в c# имеется ключевое слово checked :

try < int a = 33; int b = 600; byte c = checked((byte)(a + b)); Console.WriteLine(c); >catch (OverflowException ex)

При использовании ключевого слова checked приложение выбрасывает исключение о переполнении. Поэтому для его обработки в данном случае используется конструкция try. catch. Подробнее данную конструкцию и обработку исключений мы рассмотрим позже, а пока надо знать, что в блок try мы включаем действия, в которых может потенциально возникнуть ошибка, а в блоке catch обрабатываем ошибку.

Преобразование строки в число в Python. Особенности преобразования числа в строку

Python_Deep_21.1-5020-77b56f.png

Иногда нам нужно выполнить преобразование строки в целое число либо в число с плавающей точкой. Потребность в этом возникает для осуществления ряда операций. Как это сделать в Python, мы сейчас и поговорим.

Чтобы осуществить преобразование строки в целое число либо число с плавающей точкой, в Python используют функции int и float. Если вы захотите выполнить преобразование без применения данных функций, то получите ошибку. Например, к ошибке приведёт следующий код:

 
str_a = ’50’ b = 10 c = str_a + b print (c)
Преобразование строки в целое число с помощью int() в Python

Давайте посмотрим на следующий участок кода:

 
str_a = '50' b = 10 c = int(str_a) + b print ("The value of c = ",c)

С его помощью мы выведем значение переменной «c», которое будет представлять собой сумму переменных «str_a» и «b».

Преобразуем десятичную строку в число с плавающей точкой в Python

Для преобразования строки в число с плавающей точкой мы можем использовать float:

 
#Преобразование string во float str_a = '50.85' b = 10.33 c = float(str_a) + b print ("The value of c = ",c)

Однако учтите, что если вы захотите задействовать тут функцию int() , это приведёт к ошибке.

Преобразуем список строковых чисел в список целых чисел в Python

Бывает, что в Python необходимо выполнить преобразование строки из чисел, содержащихся в списке. В таких случаях нам поможет генератор списков. Таким образом создаётся новый список, где можно использовать функцию int() в каждой итерации:

 
#Преобразование string в int в списке str_lst = ['1', '2', '3'] int_lst = [int(x) for x in str_lst] print (int_lst)

Мы выведем новый список, который будет состоять из целых чисел, полученных из строк.

Преобразуем список строк в список чисел с плавающей точкой в Python

Аналогично можно применять float вместо int для выполнения преобразования списка, включающего в себя строки из целых чисел:

 
#Преобразование string во float в списке str_lst = ['10.505', '2.3', '3.99'] float_lst = [float(x) for x in str_lst] print (float_lst)
Преобразование строки с запятыми в число в Python

Что делать, если у нас строка наподобие «1,000,000»? Если мы попробуем выполнить её преобразование с помощью функций int() либо float() , мы получим ошибку.

Одно из решений — применение import locale:

 
locale.setlocale(locale.LC_ALL, ‘en_US.UTF-8’ )

Приём работает, но он не идеален. Другое решение — заменить запятые на пустые строки, а потом применить уже известную нам функцию int:

 
str_a = '5,123,000' int_b = int(str_a.replace(',','')) print ("The integer value",int_b)

Результат — целое значение. Это же решение мы можем использовать и для преобразования строки в число с плавающей точкой в Python.

Преобразование строки в число при расчёте високосного года в Python

Как известно, пользовательский ввод в «Пайтоне» воспринимается как строка. К примеру, в следующем коде программа попросит пользователя ввести год, а после ввода значений программа сообщит, является ли этот год високосным. При этом введённое значение сначала будет преобразовано в целое число, а потом будет задействована формула расчёта високосного года:

 
#Расчёт високосного года try: Y = int(input("Enter a Year? ")) exceptValueError: print ("You may only enter digits in '2000' format!") else: leap_or_not = Y%4 == 0 ifleap_or_not: print ("Leap year") else: print ("Not a leap year")

Таким образом происходит преобразование вводимой строки в целое число, а потом это число применяется для расчёта.

Как преобразовать целое число в строку в Python?

При выполнении преобразования целых чисел в строки используется функция str() . Она принимает объект, который может иметь тип int, float, double и так далее.

Давайте посмотрим на пример преобразования переменной int в строку, которая потом применяется как строка для конкатенации:

 
#Преобразование int в string a_string = "str function for int to string" a_num = 456 print (a_string + str(a_num))

Результат будет следующим:

 
str function for int to string456

Кстати, если бы целочисленная переменная была нами использована без str() , результатом стала бы ошибка TypeError.

Процедуры STR и VAL.

В строковую переменную можно записывать не только буквы, но и цифры. Однако это будут не числа, как таковые, а их символьное представление. Для преобразования символьных представлений числа в само число, и наоборот, используются процедуры STR и VAl.

Например, возьмем 2 числа: 125 и 347. Если эти числа записаны в строковых переменных, то с ними можно производить те действия, которые производятся над строками. Например, в результате операции сцепления 125+347 получится 125347. Если же данные числа будут записаны в переменных типа Integer или Real, то над ними можно производить операции, предусмотренные для чисел (сложение, вычитание умножение, деление, DIV, MOD и т.д.). Например, в результате операции сложения 125+347 получится 472.
В языке программирования Pascal предусмотрена возможность преобразования чисел в их символьное представление и наоборот.
Процедура STR преобразует число целого или вещественного типов в его строковое представление. Процедура имеет 2 параметра: STR (X, ST), где «X» - это число, а ST – его строковое представление. Также, можно указывать формат преобразования: STR(X:A:B, ST), где «A» задает ширину всего поля, которое выделяется для строкового представления числа, а «B» - количество символов в дробной части (последний параметр имеет значение в том случае, если преобразуется вещественное число). Процедура STR делает с числом то же, что и оператор Writeln перед тем как вывести число на экран (преобразует число в символ).
Процедура VAL преобразует строковое представление числа в само число, которое можно записать в целочисленную или вещественную переменную. Процедура имеет 3 параметра: VAL (ST, X, CODE), где ST – строка, которую необходимо преобразовать в число, X – вещественная или символьная переменная, в которую записывается это число, CODE – необязательный параметр, который, в случае ошибки будет содержать номер позиции, в которой обнаружен ошибочный символ.

Использование процедуры STR.

program string7; uses crt; var stroka,stroka1,stroka2:string; x,y,z:integer; begin clrscr; x:=1234; y:=5678; z:=x+y; writeln(z); str(x,stroka1); str(y,stroka2); stroka:=stroka1+stroka2; writeln(stroka); readln end.

Строка №3. Создаем 3 строковые переменные.

Строка №4. Создаем 3 целочисленные переменные.

Строка №7. В 1-ую переменную типа Integer записываем число 1234.

Строка №8. Во 2-ую переменную типа Integer записываем число 5678.

Строка №9. Складываем эти числа, результат записываем в 3-ю переменную.

Строка №10. Выводим результат на экран.

Строка№11. Переводим 1-ое число в его строковое представление, результат сохраняем в переменной «stroka1».

Строка №12. Переводим 2-ое число в его строковое представление результат сохраняем в переменной «stroka2».

Строка №13. Производим над строками операцию сцепления и записываем результат в переменную «stroka».

Строка №14. Выводим результат на экран.

procedura Str

procedura Str.

О процедуре STR также можно прочитать в разделе, посвященному графике в Pascal.

Использование процедуры VAL.

Напишем программу, в которой строковой переменной будет присвоено значение, определяющее дату, например, 23.02.1965. Пусть эта дата обозначает год вашего рождения. Программа, должна подсчитать, сколько вам лет на текущий момент. Текущим моментом будем считать 2012 год.

program string8; uses crt; var stroka1,stroka2:string; rog, let:integer; begin clrscr; stroka1:='23.02.1965'; stroka2:=copy(stroka1,7,4); val(stroka2,rog); let:=2012-rog; writeln(let); readln end.

Строка №7. В переменную «stroka1» записываем дату рождения.

Строка №8. В переменную «stroka2» копируем из переменной «stroka1» последние 4 символа, 1965.

Строка №9. Преобразовываем эти 4 символа в число и записываем это число в целочисленную переменную «rog».

Строка №10. В целочисленную переменную «let» записываем значение, которое получится при вычитании из числа 2012 числа 1965.

Строка №11. Выводим значение переменной «let» на экран.

Сайт учителя информатики

Lazarus. Урок № 5.

03.03.2019 | Автор: admin

Урок 5. Типы данных

В этом уроке Вы познакомитесь с основными элементами языка программирования: переменными, их типами, основными операциями и функциями.

Данные в языке Free Pascal

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

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

Участок памяти (ячейка), в которой хранится значение определенного типа, называется переменной. У переменной есть имя (идентификатор), тип и значение.

Имя служит для обращения к области памяти, в которой хранится значение.

Во время выполнения программы значение переменной можно изменить.

В Lazarus каждая переменная перед использованием должна быть описана (объявлена). При объявлении переменной задается ее имя и тип. В оперативной памяти выделяется место для хранения переменной.

Для описание переменных используется служебного слова var.

Общий вид оператора:

Var имя_переменной: тип_переменной;

Var a: integer; //Объявлена целочисленная переменная

b, c: real; //Объявлены две вещественные переменные.

Целочисленный тип данных

Целочисленные типы данных могут занимать в памяти компьютера один, два, четыре или 8 байтов.

Тип Диапазон Размер (байт)
Shortint -128 .. 127 1
Integer -32768 .. 32767 4
Longint -2147483648 .. 2147483647 4
Byte 0 .. 255 1
Word 0 .. 65535 2

Вещественный тип данных

Внутренне представление вещественного числа в памяти компьютера отличается от представления целого числа. Вещественное число представлено в экспоненциальной форме mE±p, где m – мантисса (целое или дробное число с десятичной точкой), p – порядок (целое число).Чтобы перейти от экспоненциальной формы к обычному представлению числа, необходимо мантиссу умножить на десять в степени порядок.

Вещественное число может занимать от 4 до 10 байтов.

Вещественные типы Диапазон Кол-во значащих цифр Размер, байт
Real 2.9e-39 ..1.7e+38 11-12 8
Single 1.5-e45 .. 3.4e+38 7-8 4
Double 5.0e-324.. 1.7e308 15-16 8
Extended 3.4e-4932 ..1.1e4932 19-20 8

Пример описания вещественных переменных:

r1, r2: real; d: double;

Операции и выражения

Выражение задает порядок выполнения действий над данными и состоит из операндов (констант, переменных, обращений к функциям), круглых скобок и знаков операций.

Например a + b*sin(x).

В таблице представлены основные алгебраические операторы языка программирования Free Pascal.

Оператор Действие
+ Сложение
– Вычитание
* Умножение
/ Деление
DIV Целочисленное деление
MOD Вычисление остатка от деления

Операторы целочисленной арифметики DIV и MOD применяются только к целочисленным операндам.

DIV позволяет получать целую часть результата деления одного числа на другое.

Например, 15 DIV 7 = 2.

Оператор MOD получает остаток от деления одного числа на другое.

Например, 15 MOD 7 = 1, Для задания нужного порядка выполнения операций в выражении можно использовать скобки.

Стандартные функции

В языке определены стандартные функции. Некоторые арифметические функции представлены в таблице ниже.

Обозначение Действие
Abs(n) Абсолютное значение n.
Sqrt(n) Квадратный корень из n.
Sqr(n) Квадрат n.
Exp(n) Экспонента n.
Ln(n) Натуральный логарифм n.
Random(n) Случайное целое число в диапазоне
от 0 до n-1. (перед первым обращением к функции необходимо вызвать функцию
Randomize, которая выполнит инициализацию программного генератора случайных чисел)
Sin() Синус выраженного в радианах угла
Cos() Косинус выраженного в радианах угла
Arctan() Арктангенс выраженного в радианах угла

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

(α * 3.1415256 ) / 180,

где α – величина угла в градусах, 3.1415256 –число π.

Вместо константы 3.1415256 можно использовать стандартную именованную константу PI.

Функции преобразования

Функции преобразования типов часто используются при вводе и выводе информации

Например, для того чтобы вывести в поле вывода (компонент Label) диалогового окна значение переменной Real, необходимо преобразовать число в строку символов, изображающую данное число. Это можно сделать при помощи функции FloatToStr, которая возвращает строковое представление значения выражения, указанного в качестве параметра функции.

Основные функции преобразования типов

Обозначение Действие
Chr(n) Символ, код которого равен n.
IntToStr(k) Строка, являющаяся изображением целого k.
FloatToStr(n) Строка, являющаяся изображением вещественного n.
FloatToStrF(n,f,k,m) Строка, являющаяся изображением вещественного n. При вызове функции указывают: f – формат; k – точностью (общее количество цифр); m – количество цифр после десятичной точки.Возможны следующие значения параметра Format:
ffGeneral – общий числовой формат;
ffFixed – фиксированный формат;
ffCurrency – денежный формат.
StrToInt(s) Целое, изображением которого является строка s.
StrToFloat(s) Вещественное, изображением, которого является строка s.
Round(n) Целое, полученное путем округления n по известным правилам.
Trunc(n) Целое, полученное путем отбрасывания дробной части n.
Frac(n) Дробное, представляющее собой дробную часть вещественного n.
Int(n) Дробное, представляющее собой целую часть вещественного n.

Наиболее часто программа может получать исходные данные из окна ввода или из поля редактирования (компонент Edit). Для преобразования данных в числовой тип используют соответствующую функцию.

Например, для преобразования в вещественный тип используется оператор:

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

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