powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java trunc
15 сообщений из 15, страница 1 из 1
Java trunc
    #37880644
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно выполнять данную операцию в Java, DecimalFormat выполняет округление, через BigDecimal:
Код: java
1.
2.
3.
4.
double unrounded = 1.22222;
BigDecimal bd = new BigDecimal(unrounded);
BigDecimal rounded = bd.setScale(2, BigDecimal.ROUND_DOWN);
System.out.println(rounded.doubleValue());


получаем 1.22, вроде бы то, что хотел, но для 1.2 получаем 1.19.

Такой код:
Код: java
1.
2.
3.
4.
5.
double unrounded = 1.2;
double delta = 0.000000000001
BigDecimal bd = new BigDecimal(unrounded + delta);
BigDecimal rounded = bd.setScale(2, BigDecimal.ROUND_DOWN);
System.out.println(rounded.doubleValue());


вроде бы выдает желаемый результат, но сам код как то не очень...

Как это сделать по правильному?
...
Рейтинг: 0 / 0
Java trunc
    #37880669
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
double хранит ближайшее двоичное значение к тому десятичному которое вы хотели. Вы уверены что дробь 1.2 имеет конечное представление в двоичном виде?
...
Рейтинг: 0 / 0
Java trunc
    #37880837
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
своим ответом вы поясняете причину такого поведения, но к сожалению мне все равно остается непонятным, как правильно добиться желаемого поведения.
...
Рейтинг: 0 / 0
Java trunc
    #37880846
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На stackoverflow советуют ( http://stackoverflow.com/questions/1976809/are-there-any-functions-for-truncating-a-double-in-java) использовать BigDecimal.ROUND_HALF_UP, но это тоже не trunc, 1.22999 превращается в 1.23
...
Рейтинг: 0 / 0
Java trunc
    #37881050
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобные вопросы надо в FAQ добавлять. Не было и сезона что-б кто-то снова не словил грабель.
...
Рейтинг: 0 / 0
Java trunc
    #37881206
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
и какое же решение то...?
...
Рейтинг: 0 / 0
Java trunc
    #37881216
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirmayton,
и какое же решение то...?
Одно из двух.

1) Отказаться от double в пользу BigDecimal.
2) Забить на погрешность присвоения и использовать double, но при форматировании на экране
скрывать некоторые разряды.
...
Рейтинг: 0 / 0
Java trunc
    #37881223
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimir,

вы когда пишете double x = 1.2, получаете двоичное представление 1.1(9), которое справедливо округляется до 1.19, выход - округлять вверх до 3 знака потом вниз до 2
...
Рейтинг: 0 / 0
Java trunc
    #37881225
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя там где-нибудь всеравно огребете, лучше автор Отказаться от double в пользу BigDecimal
...
Рейтинг: 0 / 0
Java trunc
    #37881243
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Код: java
1.
2.
2) Забить на погрешность присвоения и использовать double, но при форматировании на экране 
скрывать некоторые разряды.


дак мой вопрос в этом и заключается ... как скрыть разряды не округляя. Задача выполнить преобразование double -> String не производя никаких округлений. Я понимаю, что всегда можно извратиться на тему:
Код: java
1.
2.
3.
4.
5.
6.
7.
int scale = 2;
DecimalFormat format = new DecimalFormat();
format.setMinimumFractionDigits(scale + 1);
format.setMaximumFractionDigits(scale + 1);
double unrounded = 1.22222;
String tmp = format.format(unrounded);
System.out.println(tmp.substring(0, tmp.lenght() - 1));



Про использование BigDecimal вместо double решение в принципе понятное.
...
Рейтинг: 0 / 0
Java trunc
    #37881248
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Java trunc
    #37881815
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
вы так говорите, будто бы я не читал... фишка в том, что DecimalFormat при форматировании тоже выполняет округление, вот выдержка из его javadoc:
Код: java
1.
2.
3.
4.
5.
* <h4>Rounding</h4>
 *
 * <code>DecimalFormat</code> uses half-even rounding (see
 * {@link java.math.BigDecimal#ROUND_HALF_EVEN ROUND_HALF_EVEN}) for
 * formatting.
...
Рейтинг: 0 / 0
Java trunc
    #37881827
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что округление типа логичнее. Зачем транк-то?
Можно конквертнуть в строку на разряд больше с обязательными нулями и откинуть 1 символ.
Можно к int свести умножив на 100.
...
Рейтинг: 0 / 0
Java trunc
    #37881846
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
ну вот такая задача, что в интерфейс надо отдать сформатированное именно trunc'ом :-)
Предложенные вами варианты понятны, я просто искал красивую реализацию, но видимо ее нет.
...
Рейтинг: 0 / 0
Java trunc
    #37881890
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirну вот такая задача, что в интерфейс надо отдать сформатированное именно trunc'ом :-)
Предложенные вами варианты понятны, я просто искал красивую реализацию, но видимо ее нет.
Перечитал ваш первый вопрос. По-моему у вас все же с постановкой задачи что-то не то. ROUND_DOWN, то что вам нужно. А с 1.2 проблема как раз потому что 1.2 это у вас изначально не 1.2.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java trunc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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