В чем причина странного поведения двойного значения? - PullRequest
0 голосов
/ 27 июня 2018

Я создал двумерный массив для хранения двойных значений, при выполнении приведенного ниже кода десятичный диапазон некоторых значений неожиданно изменяется!

package learnJavaProj;
public class SquareRootin2D {

public static void main(String[] args) {

    double [][] arr = new double[10][10];
    double f= 0.00;
    double g=0.00;

    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            arr[i][j]=0.00;
        }
    }

    for (int i=0;i<10;i++)
    {
        arr[i][0]=f;
        arr[0][i]=g;
        g=g+0.10;
        f++;
    }
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            System.out.print(arr[i][j]+"     ");
        }
        System.out.println("\n");
    }
}

}

Выход:

0.0     0.1     0.2     0.30000000000000004     0.4     0.5     0.6     0.7  0.7999999999999999     0.8999999999999999     

1.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

2.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

3.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

4.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

5.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

 6.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

 7.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

 8.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

 9.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     

Этот тип колебаний появился и при использовании float! Пожалуйста, объясните этот хаос. Спасибо!

1 Ответ

0 голосов
/ 27 июня 2018

Java не отображает значения с плавающей точкой точно по умолчанию. По умолчанию отображается только достаточное количество цифр для однозначного различения значения.

Результатом этого является то, что некоторые значения могут отображаться как «0.1» и «0.2», но они имеют небольшие отличия от точно 0,1 и 0,2. Когда они добавляются, эти различия объединяются и становятся больше. Тогда сумма будет отличаться от 0,3 на столько, что для того, чтобы отличить ее от значения, отображаемого как «0,3», необходимо использовать «0,30000000000000004».

Когда 0.1 используется в исходном коде, он преобразуется в 0,1000000000000000055511151231257827021181583404541015625, которое является ближайшим значением к 0,1, которое может быть представлено в базовой 64-разрядной двоичной переменной с плавающей точкой IEEE-754. Точно так же 0.2 становится 0.200000000000000011102230246251565404236316680908203125, а 0.3 становится 0.299999999999999988897769753748434595763683319091796875.

Когда вы добавляете эти два значения для 0.1 и 0.2, вычисляемый результат равен 0,3000000000000000444089209850062616169452667236328125. Поскольку это значение не равно 0,299999999999999988897769753748434595763683319091796875, его необходимо распечатать как «0.30000000000000004», чтобы его можно было различить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...