Был на собеседовании, спросили, "в переменной какого типа лучше хранить деньги", сказал Float
, мол скорость, все дела. - забраковали. Ответа на вопрос "почему" не услышал. так вот почему "деньги" нельзя хранить во Float
?
Для денег важны "копейки". Потеря любой значащей цифры в финансовой сфере недопустима. Поскольку числа хранятся в двоичной системе - любое десятичное нецелое число не имеет конечное количество цифр после запятой. Поскольку мы не можем хранить бесконечно большое количество цифр после запятой, часть числа теряется.
Простой пример: 5.1 переведем в двоичный вид
Целая часть имеет только 3 цифры
5₁₀ = 1*2² + 0*2¹ + 1*2⁰ = 101₂
А вот дробная...
.1₁₀ = 0*2⁻¹ + 0*2⁻² + 0*2⁻³ + 1*2⁻⁴ + 1*2⁻⁵ + 0*2⁻⁶ + 0*2⁻⁷ + 1*2⁻⁸ + 1*2⁻⁹...
Если взять только первые 7 цифр (двоичных) после запятой, получится не 0.1
, а 0.09375
Немного, наверное, конкретики можно внести без углубления в тонкости вычислений машины:)
Тут надо еще уточнение, какие операции будут с деньгами производиться.
Для платежей и переводов - достаточен long. А сама сумма - в минорных единицах. Потому что мы не платим десятыми долями копеек/центов. Т.е. для 1 руб. 10 копеек, будем перечислять 110.
Хранить также можно в таком же типе.
Но уже появляются вопросы, когда надо проводить вычисления. К примеру, насчитать некий процент за месяц. Тут уж типы double/float, как заметили некоторые, могут давать погрешности из-за тонкостей стандарта чисел с плавающей запятой. Но есть хороший выход: есть объекты чисел, которые хранят все значения в целых числах. Конкретнее: два целочисленных значения: мантиссу вещественного числа в виде объекта класса большого целочисленного, и неотрицательный десятичный порядок числа типа int. Тут напрашивается пример для Java: класс BigDecimal
. Я бы хранил деньги в нем.
Ну а если еще углубиться в расчеты, то для всяких операций есть свои стандарты. Например, если рассчитываем пеню, то округление в большую сторону:
При пене в 1.123456 руб, получим 1.13. Все просто.
Если кто нашел в моем ответе ошибку, пожалуйста, поправьте меня. Я только въезжаю в финансовые расчетные операции.
В string деньги хранят, а точку перемещают
Нужно произвести импорт записей из файла xml, все импортируется хорошо, но только первая запись, а нужно что бы всевот код импорта:
Предполагаю что дело в кешеПри сохранении изображения с создаю папку Folder и сохраняю туда картинку
В интерфейсе среды NetBeans есть три элемента: кнопка JButton, поле jTextField и JListСкажите пожалуйста как правильно их вместе связать
Хочеться сделать подсветку края бокового меню, как в EBookDroidПожалуйста, подскажите, каким спосом реализован данный эффект?