I\'ve coded using float variables before and never had this problem.
float a, b, subtotal, stx;
a=15.95;
b=24.95;
subtotal=a+b;
stx=subtotal*.07;
cout <
The processes the string tokens that make up your code - it sees is "2.7" or 15.95, which is numeric (starts with a digit) and floating point (has a .) The default container for floating point numbers is a double (otherwise you'd get really erroneous outcomes for most of the hard coded numbers you enter. After the value of the expression is evaluated (in this case, just the value itself), it's assigned to a float value, which isn't precise enough to store the result, hence the warning.
15.95
is treated as a double no matter what it is assigned to; the variable's type only affects what value it ends up holding, not what you try to assign to it. The right side of an assignment is always evaluated first.
From standard 2.14.4
The type of a floating literal is double unless explicitly specified by a suffix.
(emphasis mine)
why is the compiler interpreting the literal values as as doubles
Because that's how literals are interpreted, unless you add modifiers to specify a different type.
a=15.95f;
^ gives the literal "float" type
But if variables are declared as float...
The type of an expression never depends on how the expression is used; so 15.95
has type double
whatever you do with it. The type is converted for use in a larger expression, if necessary, and that's what gives the warning in this case.