Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Какой тип использовать в джава программе


Автор: Иван Человеков 28.2.2007, 09:50
Использую СУБД PostgreSQL. Ребята подскажите пожалуйста какой тип выбрать в программе для подсчёта и хранения денег, а также в СУБД? Double и float пенозволяют вести, насколько я понял, точный подсчёт без округления. 
Я использую: в СУБД money, а в программе использую кусок кода:

Код

private BigDecimal stavka_razrada;
private PreparedStatement setPrepStatUpdateFirms;

…..

stavka_razrada=new BigDecimal(request.getParameter("stavka_razrada"));

….

setPrepStatUpdateFirms.setBigDecimal(2, stavka_razrada);

…..
setPrepStatUpdateFirms.executeUpdate();


ERROR: column "stavka_razrada" is of type money but expression is of type numeric

1.    Какой тип использовать в джава программе и как обрабатывать суммы?
2.    Какой тип использовать в СУБД PostgreSQL

Спасибо smile


Автор: tux 28.2.2007, 10:08
Цитата отсюда - http://www.postgresql.org/docs/8.2/interactive/datatype-money.html:
Цитата

The money type is deprecated. Use numeric or decimal instead, in combination with the to_char function.

Здесь соответствие java-типов и типов JDBC - http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/getstart/mapping.html#1033804.

Автор: y3u 28.2.2007, 17:09
вообще, касательно хранения денег, есть сложившиеся традиции, можно, к примеру, у того же Блоха почитать. Однозначно, надо хранить целым, каким-нибуь LONG желательно, а точность значения выбирать исходя из принятых на валютных биржах стандартов - отсюда и надо плясать, на 100 множить и потом делить, на 1000 или на 10000

Автор: Иван Человеков 28.2.2007, 22:27
Где бы почитать про традиции и книгу Блоха? smile 

Автор: COVD 28.2.2007, 23:20
посмотрите у Фаулера http://www.martinfowler.com/ap2/quantity.html - паттерн Quantity и его частный случай Money с примером на java.

Автор: Иван Человеков 1.3.2007, 23:00
Тип поля поменял на Numeric[30,2]
Вот мой код:
Код
private BigDecimal stavka_razrada;
...
private BigDecimal stavka_razrada;
stavka_razrada=new BigDecimal(request.getParameter("stavka_razrada"));
...
setPrepStatUpdateFirms=connection.prepareStatement(text_zapros_insert);
...
setPrepStatUpdateFirms.setBigDe

setPrepStatUpdateFirms.executeUpdate();


При выполнении возвращает код ошибки:
ERROR: column "stavka_razrada" is of type numeric[] but expression is of type numeric 

Строка запроса:
INSERT INTO firms (name_firm,stavka_razrada,fio_director,fio_gl_buh)VALUES(q,1.2,w,e)

В чём может быть ошибка? Спасибо.

Автор: Иван Человеков 2.3.2007, 07:58
Как я понял, оказывается что тип numeric[] и numeric в PostgreSQL - воспринимаются как разные типы smile  
Как только сменит на тип без скобок, ошибку выдавать перестало, но появилась другая проблема - после запятой в СУБД можно записать более 2 символов. Как решить эту проблему? 
Можно ли как-то типу BigDecimal задать фиксированную точность после запятой? 

Спасибо.

Автор: LSD 2.3.2007, 13:00
Цитата(Иван Человеков @  2.3.2007,  07:58 Найти цитируемый пост)
Можно ли как-то типу BigDecimal задать фиксированную точность после запятой?

Код
MathContext mathContext = new MathContext(3, RoundingMode.DOWN);
BigDecimal pi = new BigDecimal(Math.PI, mathContext);
System.out.println("\u03C0 = " + pi);

Автор: Иван Человеков 4.3.2007, 07:21
Спасибо разобрался smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)