Top.Mail.Ru
Ответы

Как в java умножать нецелые числа?

Пишу код, умножаю 0.1 на 0.2, получается 0.020000000000000004
Вот отрывок кода:

double c = 0.1;
double x = 0.2;
double z = (c*x);
System.out.println(z);

Почему так?

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок
7лет

Потому, что в компьютере все числа хранятся в двоичном коде. Попробуй представить десятичное число 0.1 в двоичном виде - получишь бесконечную дробь. Потому и 0.1, и 0.2 записываются приближённо. И результат вычисления с этими числами тоже может быть только приближённый.

В прикладной математике есть специальный раздел (изучаемый в ВУЗ'ах), занимающийся уменьшением ошибки при вычислениях с плавающей точкой.

Хочешь точное представление десятичных дробей - используй класс java.math.BigDecimal.

Аватар пользователя
Гений
7лет

Десятичные дробные числа иногда не имеют точного двоичного представления. Надо округлять при выводе указанием формата. Еще можно использовать BigDecimal вместо double, но это громоздко и медленней работает.

Аватар пользователя
Просветленный
7лет

Если тебе нужно именно точное представление дробей, тогда поищи пакет для работ над дробными числами.
Там 0,1 будет представляться как Rational(1,10)
0,2 будет представляться как Rational (1,5)
и если их перемножить, то получится точное значение - Rational (1,50).

BigDecimal не дадут тебе ТОЧНОЕ представление. Они лишь помогут отодвинуть место появление неточности подальше, поэтому к тебе вопрос - нахрена тебе такая точность, что за задача, в которой погрешность в 16 знаке имеет значение?
Если тебя просто бесят эти лишние знаки в выводе числа - выводи до 8 знаков и не парь себе мозг.
System.out.printf("%9f",z);

Аватар пользователя
Знаток
7лет

Округляй до нужного количества символов после запятой в формате 0.00f, например. Это для типа float.

Аватар пользователя
Мудрец
7лет

Ну всё правильно, так и должно быть! Да и нахрена ты double сделал? Ставь float!