Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Зачем при записи чисел в конце добавляют .0?


Часто в коде программ числа записываются в виде цифры с .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. Это, конечно, было неисчерпаемым источником багов в программах. Тогда считалось несолидным добавлять ноль после точки. Это же целая лишняя дырка в перфокарте!

Комментариев нет:

Отправить комментарий