Ошибка точности с числами с плавающей запятой в Java

Мне интересно, как лучше всего исправлять ошибки точности в Java. Как вы можете видеть в следующем примере, имеются ошибки точности:

class FloatTest
{
  public static void main(String[] args)
  {
    Float number1 = 1.89f;

    for(int i = 11; i < 800; i*=2)
    {
      System.out.println("loop value: " + i);
      System.out.println(i*number1);
      System.out.println("");
    }
  }
}

Отображаемый результат:

значение цикла: 11

20.789999

значение цикла: 22

41,579998

значение цикла: 44

83.159996

значение цикла: 88

166.31999

значение цикла: 176

332.63998

значение цикла: 352

665.27997

значение цикла: 704

1330.5599

Также, если кто-нибудь может объяснить, почему он делает это только начиная с 11 и каждый раз удваивая значение. Я думаю, что все остальные значения (или, по крайней мере, многие из них) показали правильный результат.

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

Изменить: Как уже упоминалось, я мог бы использовать двойное, но после попытки кажется, что 1,89 как двойное умножение на 792 по-прежнему выводит ошибку (результат 1496.8799999999999).

Думаю, я попробую другие решения например BigDecimal

10
задан mskfisher 31 May 2012 в 15:49
поделиться