2013-05-03 2 views
2

В java Я использую float для хранения чисел. Я выбрал формат float, поскольку я работаю как с целыми числами, так и с двойными числами, где числа отличаются друг от друга, могут быть большие целые числа или большие двойные числа с разным количеством десятичных знаков. Но когда я вставляю эти числа в базу данных, неправильный номер сохраняется. Например:Большое число с плавающей точкой weird results

float value = 0f; value = 67522665; System.out.println(value);

Отпечатано: 6.7522664E7 и хранится в базе данных 67522664 не как 67522665

+2

Прочитайте http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html «Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой», прежде чем делать что-либо серьезное с использованием чисел с плавающей запятой. – Patashu

ответ

6

Числа с плавающей точкой имеют ограниченное разрешение — примерно 7 значащих цифр. Вы видите ошибку округления. Вы можете использовать double для большего разрешения или, для точной арифметики, используйте BigDecimal.

Предложенное чтение: What Every Computer Scientist Should Know About Floating-Point Arithmetic

+1

Кстати, вычисление 'BigDecimal' намного медленнее, чем другие примитивные типы данных. – Drogba

+1

@ Дрогба - Да, действительно. Но если вам нужна точность, это цена, которую вам нужно заплатить. –

+0

Ограниченная точность, а не точность. – yshavit

1

Двойники и поплавки имеют проблемы хранения. How is floating point stored?

«Поплавок и двойные типы предназначены в первую очередь для научных и инженерных расчетов. Они выполняют двоичную арифметику с плавающей точкой, которая была тщательно предназначена для отделки точных приближений быстро в широком диапазоне величин. Они делают однако, не дают точных результатов и не следует использовать там, где требуются точные результаты ».

Не используйте поплавок. Используйте BigDecimal вместо этого. И в моем опыте работы с базами данных они возвращают свои NUMBER-типизированные элементы как BigDecimal. Когда я получаю их с помощью JDBC, это объекты BigDecimal.

Смежные вопросы