Java Puzzle #2: Integers and Floats

· by

Contents

Basics

As you might know, Americans measure the temperature in Fahrenheit. I'm not quite sure, but I guess the rest of the world uses Celsius.

0° C is the temperature when water freezes. 100° C is the temperature when water boils.

0° F is the lowest temperature of the winter 1708/1709 in Gdańsk. 32° F is the temperature when water boils.

If you want to calculate the temperature \(T_C\) in °C from \(T_F\) in °F you can use this formula: \(T_C = (T_F − 32) · \frac{5}{9}\)

The puzzle

What is the output of the following script?

public class test {
    static double fahrenheitToCelsius(double fahrenheit) {
        return (fahrenheit - 32) * (5 / 9);
    }

    public static void main(String[] args) {
        double fahrenheit = 100;
        double celsius = fahrenheitToCelsius(fahrenheit);
        System.out.format("%.2f° Fahrenheit is %.2f° C\n",
                fahrenheit, celsius);

        fahrenheit = 30;
        celsius = fahrenheitToCelsius(fahrenheit);
        System.out.format("%.2f° Fahrenheit is %.2f° C\n",
                fahrenheit, celsius);
    }
}

. . . . . . . . . . . . . . . . . . . . . . . . .

Answer

100.00° Fahrenheit is 0.00° C
30.00° Fahrenheit is -0.00° C

Explanation

The problem is integer division.

public class test {
    public static void main(String[] args) {
        System.out.format("5 / 9 = %.2f\n", (double) (5 / 9));
    }
}

This outputs:

5 / 9 = 0.00

So you are multiplying with \(\pm 0\) instead of \(0.55555\).