Я работаю над пониманием ограничений двойного. 0,1 не может быть выражена в конечной системе, поскольку она является повторяющимся двоичным значением. Но, когда я объявляю переменную и даю ей 0,1, она по-прежнему печатает как 0,1 и не .0999999999999999, 1.000000000000001 или что-то подобное. Но, если я добавлю переменную, которая имеет 0,1 десять раз, она выйдет на .9999999999999999, что я и ожидал.Сравнение «0,1» с .1
Реальный вопрос, почему он печатает ровно в 0,1, когда я знаю, что это невозможно, и у меня есть доказательство, что это не истинное значение?
double d = 0.1;
System.out.printf("%.16f\n",d);
System.out.printf("%.16f", d + d + d + d + d + d + d + d + d + d);
То, что я пытаюсь сделать, это сравнить строковый литерал с двойным преобразованием, чтобы увидеть, если значение в строке может быть точно представлено в два раза. Например:
".5" == .5? Ожидаемый ответ: Да.
".1" == .1? Ожидаемый ответ: Нет
Сравнение Я пытаюсь это
number = new BigDecimal("0.1");
d = number.doubleValue();
if (number.compareTo(new BigDecimal(Double.toString(d))) == 0){
// Doing something
}
Любая помощь понять, почему это не различая между значениями, которые могут и не могут быть представлены двойной будут оценены.
Вы уверены, что 'BigInteger' верен для вас? Кроме того, почему бы вам не напрямую поддерживать 'd' в конструкторе' BigDecimal'? – Clashsoft
Вы правы, это должно было быть BigDecimal. Я только пытался получить соответствующие биты кода и сделал эту ошибку. Я исправил это в вопросе. –