2014-02-12 3 views
0
private void fillInState() { 
    state [0][0] = 0.6; 
    state [0][1] = 0.4; 
    state [1][0] = 0.3; 
    state [1][1] = 0.6; 
    state [1][2] = 0.1; 
    state [2][0] = 0.7; 
    state [2][2] = 0.3; 
} 


private void fillInNext() { 
    next [0][0] = 1.0; 
} 

public void chain (int time) { 
    for(int i=0; i<time;i++) { 
     for(int j=0; j<3;j++) { 
      double temp = 0; 
      for(int k=0;k<3;k++) { 
       temp = state[k][j] * next [k][i] + temp; 

       if(k==2) { 
        next[j][i+1]=temp;     
       } 
      } 
     } 
    } 
} 

ожидаемый ответ должен быть:Java двойной расчет между десятичного знака

1.0 0.6 0.48 
0.0 0.4 0.48 
0.0 0.0 0.04 

Но ответ в Bluej является:

1.0 0.6 0.48 
0.0 0.4 0.48 
0.0 0.0 0.04000000000000001 

Любой знает, что случилось? Это о двойном классе или blueJ?

+0

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

ответ

1

Это просто из-за floating-point errors. Вы всегда можете форматировать вывод, используя что-то вроде Printf: учебник

double d = 0.04000000000000001; 
System.out.println(d); 
System.out.printf("%.2f%n", d); 
 
0.04000000000000001 
0.04 

знакомства Оракула Formatting Numeric Print Output.

+0

Что делать, если Я хочу сохранить результат обратно в массив? – user3302184

+0

@ user3302184 Тогда вы можете просто сохранить его в обычном режиме. Форматирование предназначено только для преобразования фактического двойного изображения в визуальное представление; он не имеет никакого отношения к самому значению двойника. – arshajii

0

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

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

Часто вы можете просто игнорировать эти ошибки округления результата вы выводите на экран и т.д.

Смежные вопросы