Точность БД, дополненная случайными числами с использованием Spring JdbcTemplate

Я использую Spring JdbcTemplate для запуска оператора вставки SQL. Поле, в которое я хочу вставить, это NUMBER. Значение: -0.11111111 типа float. Однако после вставки в БД полученное значение дополняется случайными числами -0.1111111119389534.

Обратите внимание, что когда я использую прямой JDBC, значение вставляется как есть, без дополнений.

Я использую BeanPropertySqlParameterSource и MapSqlParameterSource для установки параметров оператора INSERT, оба дают одинаковые результаты. Код выглядит следующим образом:

BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(stat);
int n = jt.update(query, params);

где jt — момент SimpleJdbcTemplate.

БД - Оракл.

Спасибо.


person Will Sumekar    schedule 21.02.2011    source источник
comment
Могу ли я узнать, какая версия Spring JDBC используется?   -  person Daniel Baktiar    schedule 22.02.2011


Ответы (1)


Для типа данных Java float Spring JDBC ведет себя иначе, чем прямой JDBC.

Рассмотрим оператор SQL INSERT INTO table (field) VALUES (-0.11111111) с field типом Oracle NUMBER и -0.11111111 типа float.

С прямым JDBC он дает значение field как есть, то есть -0,11111111.

Но с Spring JDBC (используя JdbcTemplate.update(), он дает значение field, дополненное числами, то есть -0,1111111119389534.

Для типа Java double такой разницы нет. Вставленное значение не дополняется цифрами.

С типом данных Java BigDecimal вставленное значение в БД также будет дополнено числами, то есть -0,1111111099999999990428634077943570446223, и это согласуется как для прямого JDBC, так и для Spring JDBC.

Результаты для float понятны, поскольку Java заявляет в своей документации, что «тип данных (Float) никогда не должен использоваться для точных значений, таких как валюта». Таким образом, несмотря на то, что поведение в Direct JDBC и Spring JDBC отличается, мы не можем сказать, что это неправильно.

Для BigDecimal прочитайте http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29

person Will Sumekar    schedule 22.02.2011
comment
Я задал еще один вопрос о проблеме BigDecimal по адресу stackoverflow.com/questions/5074735/ - person Will Sumekar; 22.02.2011