Как java сохраняет float v double

Я понимаю, что десятичное число может быть только настолько точным, чтобы сохранить его как число с плавающей запятой в двоичной системе, но чего я не понимаю, так это того, что происходит с 7-м десятичным знаком в моем выводе 10 / 7.

В моем первом тесте результатов я заметил, что 5 (7-е место) в конце числа с плавающей запятой против 4 (7-е место), за которым следует 2 в двойном. Я бы подумал, что 7-е место в поплавке будет 4, так как 8-е место в двойном случае - 2.

Float 1.4285715 Double 1.4285714285714286

Затем я провел следующий тест вывода, используя формат с плавающей запятой для 17 позиций. 8-е место в каждом из них разное - число с плавающей запятой равно 6, поэтому 7-е место округляется до 5, как я полагаю.

Поплавок 1.428571462631225600 Double 1.428571428571428600

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

Если у меня есть упрощенный вопрос к сложному методу хранения с плавающей запятой - прошу прощения.

    float f = 10/7f;
    double d = 10/7d;

    System.out.format
        ("Float  %1s\nDouble %2s\n", f,d);
    /*
     *  Float  1.4285715
        Double 1.4285714285714286
     */

    System.out.format
        ("Float  %1$.17f\nDouble %2$.17f\n", f,d);
    /*
     *  Float  1.428571462631225600
        Double 1.428571428571428600
     */

    System.out.format
        ("Float  %1s\nDouble %2s\n", (double)f,d);
    /*
     *  Float  1.4285714626312256
        Double 1.4285714285714286
     */
5
задан user1178761 30 January 2012 в 19:49
поделиться