Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение числа копеек в "312.03", Math.ceil или Math.round? 
V
    Опции темы
Tsahes
Дата 28.2.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Посоветуйте, пожалуйста, как преобразовать double в int без потери точности. Случай очень частный - получение числа копеек.

Код

double amount = 312.03;
System.out.println(amount);
System.out.println(amount * 100);
System.out.println((int) (amount * 100));


Вывод:
Код

312.03
31202.999999999996
31202


Понятно, что double хранит значения с погрешностью, и надо округлять. Вопрос в том, какой именно из этих методов правильнее будет использовать:
Код

Math.round(amount * 100);
Math.ceil(amount * 100);

PM MAIL   Вверх
AntonSaburov
Дата 28.2.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Так все зависит от того, что надо.
Если честное математическое округление - тогда round
Если же наименьшее целое по модулю (т.е. чиосло -3.8 округляется до -3) - тогда ceil
PM MAIL WWW ICQ   Вверх
maximUAs
Дата 28.2.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Еще лучше использовать BigDecimal
PM MAIL   Вверх
y3u
Дата 28.2.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



еще есть извращенский способ  smile очень извращенский  smile 

Код

new Float(Float.parseFloat(new DecimalFormat("#0.00", new DecimalFormatSymbols(Locale.ENGLISH)).format(amount)) * 100).intValue()


Это сообщение отредактировал(а) y3u - 28.2.2007, 19:13


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Tsahes
Дата 28.2.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Применительно к получению числа копеек из double, их не может быть либо на одну меньше, либо на одну больше ).
Если хранимое в double значение всегда немного меньше истинного, то я выберу Math.ceil();
Если хранимое в double значение может быть как немного меньше истинного, так и немного больше истинного, то я выберу Math.round(); Может, его и выбрать, как универсальный?
Правильным ли будет выбор Math.round() без грабель для любых сумм?
PM MAIL   Вверх
Tsahes
Дата 28.2.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Цитата(y3u @  28.2.2007,  19:12 Найти цитируемый пост)
еще есть извращенский способ   очень извращенский  

Нда, почувствуйте разницу ).
Код

double amount = 312.03;
System.out.println("amount " + amount);
System.out.println("(int) (amount * 100) " + (int) (amount * 100));
System.out.println("new Float(amount * 100).intValue() " + new Float(amount * 100).intValue());
System.out.println("new Double(amount * 100).intValue() " + new Double(amount * 100).intValue());


Вывод:
Код

amount 312.03
(int) (amount * 100) 31202
new Float(amount * 100).intValue() 31203
new Double(amount * 100).intValue() 31202


Не прошло.

Это сообщение отредактировал(а) Tsahes - 28.2.2007, 19:41
PM MAIL   Вверх
nornad
Дата 28.2.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Tsahes, умные люди уже давно пришли к выводу, что суммами валют надо оперировать в целочисленном виде, а не в числах с плавающей запятой. Иначе у тебя погрешности будут чем дальше, тем крупнее. Ну, не может double хранить все числа доступного диапазона. Просто физически не может. Вот и хранит приближённо. В подавляющем большинстве случаев этой приближённости вполне достаточно.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Tsahes
Дата 1.3.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Кто спорит...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1073 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.