I thought it only truncated at the moment it had to store it in the integer.

C has two different sets of arithmetic operators: integer and floating-point.

By default, arithmetic is integer using the int datatype. "5 * 37" is performed using integer arithmetic with int as the datatype. Results less than -32768 or greater than +32767 are undefined.

char C = 15;

char X = 82;

Serial.print( C * X ); // C and X are promoted to int and then an integer multiply is performed.

If an operand is a larger datatype, the operation is performed in that datatype...

int F = 5;

long TS = 37;

Serial.print( F * TS ); // is performed using integer arithmetic with long as the datatype. Results less than -2147483648 or greater than +2147483647 are undefined.

If an operand is a floating-point datatype...

int F = 5;

float PI = 3.1415;

Serial.print( F * TS ); // is performed using floating-point arithmetic with float as the datatype

Adding ".0" forced to compiler to use floating-point arithmetic.