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