Я вызываю метод truncate для усечения двойного значения, так что после десятичной (без округления) должна быть одна цифра),
Для примера. truncate(123.48574) = 123.4
.
Мой метод усечения - это что-то вроде этого
public double truncate (double x) {
long y = (long) (x * 10);
double z = (double) (y / 10);
return z;
}
Он работает отлично для почти всех значений, кроме этого странного вывода.
double d = 0.787456;
d = truncate(d + 0.1); //gives 0.8 as expected. Okay.
Но,
double d = 0.7;
d = truncate(d + 0.1); //should also give 0.8. But its giving 0.7 only.
//Strange I don't know why?
Infact работает отлично для всех остальных 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, -, 0.8, 0.9
Я имею в виду, например,
double d = 0.8;
d = truncate(d + 0.1); //gives 0.9 as expected
Я попробовал это с помощью BigDecimal
. Но то же самое. Без изменений.
Вот код для этого.
double d = 0.7;
BigDecimal a = new BigDecimal(d + 0.1);
BigDecimal floored = a.setScale(1, BigDecimal.ROUND_DOWN);
double d1 = floored.doubleValue();
System.out.println(d1); //Still gives 0.7
И снова реальный факт заключается в том, что он отлично работает с Math.round
.
public double roundUp1d (double d) {
return Math.round(d * 10.0) / 10.0;
}
Поэтому, если я назову roundUp1d(0.7 + 0.1)
, он даст 0.8, как ожидалось. Но я не хочу, чтобы значения округлялись, поэтому я не могу использовать это.
В чем проблема с 0.7?