Хранение чисел с плавающей запятой в базе данных Android - PullRequest
3 голосов
/ 20 февраля 2012

Я пытаюсь хранить суммы в долларах в базе данных sqlite, предоставленной Android, но, похоже, она не работает должным образом.Эта ошибка возникает, только когда я пытаюсь удалить транзакцию, которая не является целой суммой в долларах.то есть 409,00 будет работать, но 410,44 не будет.

Если я сохраню значение, такое как 410,44, а затем запросю в базе данных эту сумму, я не получу совпадения.Я пытался использовать это поле как тип данных REAL и TEXT, но ни один из них не работает.В следующем примере метод getTransAmount () возвращает число с плавающей запятой.Это версия, которую я запускал, когда у меня был тип данных db как REAL.Любая помощь будет оценена.Благодарю.

cv.put(transAmount, t.getTransAmount());

db.insert(tableName, null, cv);
x = db.delete(tableName, transAmount + " = " + t.getTransAmount(), null); 

1 Ответ

7 голосов
/ 20 февраля 2012

Не используйте с плавающей запятой для хранения сумм в валюте. С плавающей запятой неточно;как вы узнали, сравнения с плавающей запятой особенно сложны.

Обычно я храню суммы в валюте в базе данных как целые числа, например, 410.44 будет храниться как 41044, а 409.00как 40900.

Когда вам нужно преобразовать в формат 410.44 для отображения, вы можете использовать класс BigDecimal, передав ему используемую шкалу (в нашем случае - 2), то есть числоцифр для сдвига десятичной точки на.

Пример:

int        storedAmount = 41044;
BigDecimal scaledAmount = new BigDecimal(storedAmount);
scaledAmount.setScale(2);  // now contains 410.44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...