Как магазины java плавают в два раза - PullRequest
5 голосов
/ 30 января 2012

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

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

Поплавок 1.4285715 Двухместный 1.4285714285714286

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

Поплавок 1.428571462631225600 Двухместный 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
     */

Ответы [ 4 ]

6 голосов
/ 31 января 2012

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

Это ожидание имеет смысл, только если вы думаете, что числа с плавающей запятой хранятся внутри в десятичном виде и округляются до некоторого количества десятичных цифр. Но это не так, числа с плавающей запятой хранятся внутри в двоичном и округляются до некоторого числа двоичных цифр.

Ваши ожидания основаны на неправильном понимании того, как хранятся числа с плавающей запятой. Вы видите, что двойные числа имеют более точные десятичные разряды только потому, что это является следствием того, что они имеют более точные двоичные разряды. Реализация вообще не хранит числа в десятичной форме.

3 голосов
/ 30 января 2012
2 голосов
/ 30 января 2012

Для упрощенного объяснения попробуйте этот сайт:

http://floating -point-gui.de / basic /

Для очень подробного объяснения попробуйте следующее:

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

1 голос
/ 30 января 2012

Похоже, что при использовании float для этого числа используется точность по умолчанию 8 цифр. Когда вы указываете точность, она дает понять, что фактически использует double для вычисления значения.

...