Вычисление остатка от двух двойников в Java - PullRequest
5 голосов
/ 05 апреля 2011

У меня есть следующий код:

Double x = 17.0;
Double y = 0.1;

double remainder = x.doubleValue() % y.doubleValue();

Когда я запускаю это, я получаю остаток = 0.09999999999999906

Есть идеи почему ??

Мне нужно проверить, что x полностью делится на y.Можете ли вы предложить альтернативные способы сделать это в Java.

Спасибо

Ответы [ 4 ]

11 голосов
/ 05 апреля 2011

Из-за того, как представлены числа с плавающей запятой.

Если вы хотите получить точные значения, используйте BigDecimal:

BigDecimal remainder = BigDecimal.valueOf(x).remainder(BigDecimal.valueOf(y));

Еще один способ - умножить каждое значение10 (или 100, 1000), приведите к int, а затем используйте %.

4 голосов
/ 05 апреля 2011

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

if (remainder < ERROR || remainder > 0.1 - ERROR)

Кроме того, не используйте Double, если хотите использовать double

1 голос
/ 05 апреля 2011

Ожидание точных результатов от двойной арифметики на компьютерах проблематично. Основная причина в том, что мы, люди, в основном используем базу 10, тогда как компьютеры обычно хранят числа в базе 2. Между ними есть проблемы с преобразованием.

Этот код будет делать то, что вы хотите:

public static void main(String[] args) {
    BigDecimal x = BigDecimal.valueOf(17.0);
    BigDecimal y = BigDecimal.valueOf(0.1);

    BigDecimal remainder = x.remainder(y);
    System.out.println("remainder = " + remainder);

    final boolean divisible = remainder.equals(BigDecimal.valueOf(0.0));
    System.out.println("divisible = " + divisible);

}
1 голос
/ 05 апреля 2011

Этот пост должен помочь вам. Он объясняет, почему вы видите такое поведение, а также обсуждает класс BigDecimal.

...