The notation for octal number literals, starting with 0, is only for integers.

020 is an integer literal, so it is interpreted as an integer with the decimal value 16, which you then assign to a double, so that the int gets converted to a double.

020.0 is not an octal floating-point literal. It's a decimal floating-point literal; that's why you see the value 20.0 (decimal) printed. A leading 0 when writing a floating-point literal does not mean that the notation is octal.

Look at

section 3.10.1 and 3.10.2 of the

Java Language Specification for the exact details.