Я кодировал с использованием переменных с плавающей точкой раньше и никогда не имел этой проблемы.
float a, b, subtotal, stx;
a=15.95;
b=24.95;
subtotal=a+b;
stx=subtotal*.07;
cout << "Item 1: $" << a << endl;
cout << "Item 2: $" << b << endl;
cout << "\nSubtotal: $" <<subtotal<< endl;
cout << "Sales Tax: $" << stx << endl;
cout << "Total: $" << subtotal+stx << endl;
относительно прямой код
warning C4305: '=' : truncation from 'double' to 'float'
Я понимаю идею обрезания данных (и я также знаю, что вы можете написать f
в конце переменной. Но если переменные объявлены как float, почему компилятор интерпретирует литеральные значения как удвоенные, если они были объявлены как float.
Я посмотрел несколько других билетов, и они отличались от моего запроса. Я не могу найти решение, почему данные читаются как двойные, если они объявлены как плавающие.
почему компилятор интерпретирует литеральные значения как двойные
Потому что так интерпретируются литералы, если только вы не добавите модификаторы для указания другого типа.
a=15.95f;
^ gives the literal "float" type
Но если переменные объявлены как float …
Тип выражения никогда не зависит от того, как оно используется; так 15.95
имеет тип double
что бы вы ни делали с этим. Тип преобразуется для использования в большем выражении, если это необходимо, и это то, что дает предупреждение в этом случае.
15.95
считается двойным, независимо от того, на что он назначен; тип переменной влияет только на то, какое значение она имеет оказывается держа, а не то, что вы пытаетесь присвоить ему. Правая сторона задания всегда оценивается первой.
Обрабатывает строковые токены, которые составляют ваш код — он видит «2.7» или 15.95, который является числовым (начинается с цифры) и с плавающей запятой (имеет.). Контейнер по умолчанию для чисел с плавающей запятой — двойной (в противном случае вы вы получите действительно ошибочные результаты для большинства жестко закодированных номеров, которые вы вводите.
После оценки значения выражения (в данном случае только самого значения) оно присваивается плавающему значению, которое недостаточно точно для сохранения результата, отсюда и предупреждения.
Из стандарта 2.14.4
Тип плавающего литерала — двойной если явно не указано суффиксом.
(акцент мой)