Java

Как в 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.
СМ
Саят Марат
78 969
Лучший ответ
Игорь Мухин Как выразить точно эти числа?
В микропроцессоре дробные числа представлены как 1/2 + 1/4 + 1/8 и так далее, то бишь приближенно
и для некоторых чисел выходит погрешность в самом конце. Так что округляй всегда и будет тебе счастье
Игорь Колодин
Игорь Колодин
87 575
0,1
0,2
Попробуй проставить запятые вместо точки
У меня похожий глюк был, когда-то давно
Евгений Поп
Евгений Поп
68 690
Игорь Мухин Ошибку выдаёт
Рамиз Назаров Во всех ЯП дробная часть отделяется точкой. Запятая используется при преобразовании данных из строки в число и обратно, если учитываются региональные настройки для России.
Десятичные дробные числа иногда не имеют точного двоичного представления. Надо округлять при выводе указанием формата. Еще можно использовать BigDecimal вместо double, но это громоздко и медленней работает.
Если тебе нужно именно точное представление дробей, тогда поищи пакет для работ над дробными числами.
Там 0,1 будет представляться как Rational(1,10)
0,2 будет представляться как Rational (1,5)
и если их перемножить, то получится точное значение - Rational (1,50).

BigDecimal не дадут тебе ТОЧНОЕ представление. Они лишь помогут отодвинуть место появление неточности подальше, поэтому к тебе вопрос - нахрена тебе такая точность, что за задача, в которой погрешность в 16 знаке имеет значение?
Если тебя просто бесят эти лишние знаки в выводе числа - выводи до 8 знаков и не парь себе мозг.
System.out.printf("%9f",z);
Ну всё правильно, так и должно быть! Да и нахрена ты double сделал? Ставь float!
Борис Аксенов
Борис Аксенов
10 071
Игорь Мухин с float такая же ошибка, умник
Алексей Холманских Какая разница? double точней.
Может не дробные?!
Округляй до нужного количества символов после запятой в формате 0.00f, например. Это для типа float.