Часто в коде программ числа записываются в виде цифры с .0 на конце. Например:
C: double s = 1.0 / 6.0;
Delphi: var d: Single; begin d := 16.0 + 1.0; end;
JS: var t = 90.0;
Возможны примеры и на других языках, но для начала предлагаю ограничиться этими тремя
Какой смысл несет добавление .0 в данных случаях?
В каких случаях .0 можно опускать, а в каких он меняет логику поведения программы?
Ответы
Ответ 1
Если говорить в общем, то добавление .0 к числу, изменяет его тип и превращает ег
из целого, в дробное (число с плавающей точкой). Такое изменение типа числа влияет на то, как оно будет храниться в памяти и на то, как и какие операции с ним могут выполняться.
В JS добавление .0 абсолютно лишено всякого смысла, т.к. там все числа изначально являются дробными.
В Delphi так же не возникает необходимости вручную приводить целые числа к дробным
т.к. компилятор замечательно справляется с этим самостоятельно, там где это нужно. Операци
деления двух целых всегда возвращает дробное число и его невозможно по ошибке присвоить целому. Для особых случаев, когда надо выполнить целочисленное деление, есть специальный оператор div.
А вот в Си и некоторых других языках, и для целочисленного, и для обычного делени
используется один и тот же оператор деления / который ведёт себя по разному, в зависимости от типа операндов:
если оба операнда целые, то и в результате деления будет целое (целочисленное деление)
double i = 5 / 2; даст 2.0 (дробная часть результата операции отбрасывается, получается целое число, которое затем приводится к целевому типу double).
если хоть один из операндов является дробным, то и результат будет дробным: double i = 5 / 2.0; даст 2.5.
В Си, вместо .0 перед числом можно указывать тип числа с плавающей точкой (float/double)
т.е. выполнять приведение типа: double i = 5 / (double) 2; такая конструкция используется, если операнд не число, а переменная целочисленного типа:
int k = 2;
double i = 5 / (double) k; // --> i = 2.5
Ответ 2
В конце литерала нужно добавлять .0 в том случае, если вам важно получить тип с плавающе
точкой. Я приведу пример для С/С++, но он также будет актуальным для Java, C# и многих других языков:
double X = 15 / 2; // Выведет 7
Здесь тип переменной - double, так что можно подумать, что в ответе получится 7.5
но это не так. Поскольку и 15 и 2 не имеют дробной части, они будут считаться целым
числами при вычислении, и для них сначала будет произведено целочисленное деление (15 / 2 = 7), а потом полученный результат будет конвертирован и записан в переменную типа double.
Это можно исправить, добавив пустую дробную часть к одному или к обоим литералам
Если один из операндов является числом с плавающей точкой, то второй операнд тоже будет конвертирован в число с плавающей точкой, и вы получите правильный результат:
double X = 15.0 / 2; // Выведет 7.5
Общее правило для C++ и подобных языков: добавляйте .0 к литералам тогда, когда ожидаете ответ типа float или double. Это поможет избежать неожиданностей.
Ответ 3
.0 задавать для значения переменной нужно для того, что бы явно показать как компилятор
(интерпретатору) языка, так и программисту, что в контексте использования переменной речь идет о дробных числах. Один из возможных примеров тут.
Изучайте базовые типы и приемы работы с переменными этих типов для тех платформ и языков, на которых программируете или собираетесь начать программировать.
Если у вас есть вероятность, что в результатах ваших вычислений будут задействованы дробные числа - так и работайте с переменными соответствующих типов.
Ответ 4
В давние времена, когда появился Fortran - первый язык программирования высокого уровня, имеющий транслятор, это были азы, с которых начиналось обучение программированию.
Добавление точки после числа сейчас называют неявным приведением типа.
Когда надо было получить тип REAL от деления целых, писали Z=(X+0.)/(Y+0.)
или Z=7./8.
Это, конечно, было неисчерпаемым источником багов в программах.
Тогда считалось несолидным добавлять ноль после точки.
Это же целая лишняя дырка в перфокарте!
Комментариев нет:
Отправить комментарий