powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление в JAVA
9 сообщений из 34, страница 2 из 2
Округление в JAVA
    #37593829
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никНу например тебе надо заскэйлить картинку, не пихать же туда BigDecimal
Ну, и не использовать же при этом округление double?
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593846
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grokособенно когда надо округлить миллион чисел
Если прям действительно узкое место и диапазон значений достаточно узкий, то можно вообще на битовых операциях округлить. Хотя не факт что будет быстрее умножения\деления.
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593866
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу, и не использовать же при этом округление double?

В общем случае вы правы, просто был случай когда после рескейла надо было вывести на экран информацию о том, насколько картинка была масштабирована, и вот именно в этом случае мне нужно было округление доубла, но это редко, да
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593880
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никВ общем случае вы правы, просто был случай когда после рескейла надо было вывести на экран информацию о том, насколько картинка была масштабирована, и вот именно в этом случае мне нужно было округление доубла, но это редко, да
- Именно в этом случае потери производительности при использовании BigDecimal ни на что не влияют. У вас одно значение scale для одной картинки.
- А главное то что в этом случае вам и округлять не нужно было вообще. При выводе лишнее обрезается через NumberFormat или форматированый вывод.
...
Рейтинг: 0 / 0
Округление в JAVA
    #37829718
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BigDecimal a = new BigDecimal("12345678.132");
System.out.println(a.add(new BigDecimal("1"), new MathContext(2, RoundingMode.HALF_EVEN)).toPlainString());

Ожидаю: 12345679.13
Получаю: 12000000
WTF!?
...
Рейтинг: 0 / 0
Округление в JAVA
    #37829734
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MathContext(2, ... с точностью в 2 цифры
precision - the number of digits to be used for an operation; results are rounded to this precision
это не "после запятой", это - "вообще"
используйте 0
...
Рейтинг: 0 / 0
Округление в JAVA
    #37829791
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczMathContext(2, ... с точностью в 2 цифры
precision - the number of digits to be used for an operation; results are rounded to this precision
это не "после запятой", это - "вообще"
используйте 0
Понял, спс.
А что делать когда возникает ситуация наподобие 1/3, когда в результате получаем 0.3333.....3? В такие моменты вылетает эксепшн "java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result".
...
Рейтинг: 0 / 0
Округление в JAVA
    #37829799
z0z0iberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
z0z0iberg BlazkowiczMathContext(2, ... с точностью в 2 цифры
precision - the number of digits to be used for an operation; results are rounded to this precision
это не "после запятой", это - "вообще"
используйте 0
Понял, спс.
А что делать когда возникает ситуация наподобие 1/3, когда в результате получаем 0.3333.....3? В такие моменты вылетает эксепшн "java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result".

Догнал сам:
System.out.println(new BigDecimal("1").divide(new BigDecimal("3"), 2, RoundingMode.HALF_EVEN).toPlainString());
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Округление в JAVA
    #38456127
e-rover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вижу за это время вопрос десятичного округления не прояснился:
люди то преобразуют double в BigDecimal через строку (без комментариев)
то в стиле round(45.457*100)/100.00. Про неточность этого метода уже писалось выше.

Далее точный метод десятичного округления:
Код: java
1.
2.
3.
	// создаем один глобальный контекст наших вычислений с точностью 15 десятичных знаков
	// больше не нужно - в double 16-й знак - это уже погрешность представления в двоичном формате
	public static final MathContext myMathContext = new MathContext(15, RoundingMode.HALF_UP);



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	// двоичное представление десятичного числа. Содержит погрешность преобразования
	double paramDouble = 13.5465D;
	System.out.println("paramDouble=" + new BigDecimal(paramDouble));
		
	// точное десятичное число, очищенное от погрешности преобразования в double
	BigDecimal bd = new BigDecimal(paramDouble, myMathContext);
	System.out.println("bd=" + bd);
	// точное десятичное округление. 5 всегда вверх
	BigDecimal bdRounded = bd.setScale(3, RoundingMode.HALF_UP);
	System.out.println("bdRounded=" + bdRounded);

	System.out.println("Округление BigDecimal без myMathContext = " + new BigDecimal(paramDouble).setScale(3, RoundingMode.HALF_UP));



Вывод:
paramDouble=13.5464999999999999857891452847979962825775146484375
bd=13.5465000000000
bdRounded=13.547
Округление BigDecimal без myMathContext = 13.546

Т.е. нет ошибки конструктора new BigDecimal(double). Есть известная погрешность двоичного представления и правильный способ преобразования double в BigDecimal с использованием MathContext.
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление в JAVA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]