oop — в C ++ значение с плавающей запятой усекается от double

Я кодировал с использованием переменных с плавающей точкой раньше и никогда не имел этой проблемы.

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.

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

0

Решение

почему компилятор интерпретирует литеральные значения как двойные

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

a=15.95f;
^ gives the literal "float" type

Но если переменные объявлены как float …

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

5

Другие решения

15.95 считается двойным, независимо от того, на что он назначен; тип переменной влияет только на то, какое значение она имеет оказывается держа, а не то, что вы пытаетесь присвоить ему. Правая сторона задания всегда оценивается первой.

2

Обрабатывает строковые токены, которые составляют ваш код — он видит «2.7» или 15.95, который является числовым (начинается с цифры) и с плавающей запятой (имеет.). Контейнер по умолчанию для чисел с плавающей запятой — двойной (в противном случае вы вы получите действительно ошибочные результаты для большинства жестко закодированных номеров, которые вы вводите.
После оценки значения выражения (в данном случае только самого значения) оно присваивается плавающему значению, которое недостаточно точно для сохранения результата, отсюда и предупреждения.

1

Из стандарта 2.14.4

Тип плавающего литерала — двойной если явно не указано суффиксом.

(акцент мой)

0
По вопросам рекламы [email protected]