Как в java умножать нецелые числа?
Пишу код, умножаю 0.1 на 0.2, получается 0.020000000000000004
Вот отрывок кода:
double c = 0.1;
double x = 0.2;
double z = (c*x);
System.out.println(z);
Почему так?
Потому, что в компьютере все числа хранятся в двоичном коде. Попробуй представить десятичное число 0.1 в двоичном виде - получишь бесконечную дробь. Потому и 0.1, и 0.2 записываются приближённо. И результат вычисления с этими числами тоже может быть только приближённый.
В прикладной математике есть специальный раздел (изучаемый в ВУЗ'ах), занимающийся уменьшением ошибки при вычислениях с плавающей точкой.
Хочешь точное представление десятичных дробей - используй класс java.math.BigDecimal.
Десятичные дробные числа иногда не имеют точного двоичного представления. Надо округлять при выводе указанием формата. Еще можно использовать BigDecimal вместо double, но это громоздко и медленней работает.
Если тебе нужно именно точное представление дробей, тогда поищи пакет для работ над дробными числами.
Там 0,1 будет представляться как Rational(1,10)
0,2 будет представляться как Rational (1,5)
и если их перемножить, то получится точное значение - Rational (1,50).
BigDecimal не дадут тебе ТОЧНОЕ представление. Они лишь помогут отодвинуть место появление неточности подальше, поэтому к тебе вопрос - нахрена тебе такая точность, что за задача, в которой погрешность в 16 знаке имеет значение?
Если тебя просто бесят эти лишние знаки в выводе числа - выводи до 8 знаков и не парь себе мозг.
System.out.printf("%9f",z);
Округляй до нужного количества символов после запятой в формате 0.00f, например. Это для типа float.
Ну всё правильно, так и должно быть! Да и нахрена ты double сделал? Ставь float!