2016-03-14 3 views
1

Я пытаюсь сделать эту программу, где у вас есть разные предметы, которые вы можете купить.Как использовать BigDecimals без использования парных разрядов

im хранение моих цен в базе данных sqlite (не определил тип данных, кроме того, что он будет строковым или целочисленным).

Я прочитал в течение 2 часов, пытаясь получить зависание, я понимаю, почему я не могу использовать удвоения или значения поплавка.

но я не могу решить: должен ли я хранить свои цены в виде целых чисел? или строки.

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

если я хранить их как целые числа у меня будет проблема:

int 5/100 //i want that to be 0.05 
int 50/100 //i want that to be 0.50 
int 500/100 //i want that to be 5.00 

как я сделать это без использования двойников ??

или, возможно, есть способ сделать это с помощью BigDecimals?

BigDecimal bddd1 = bdd1.setScale(2,RoundingMode.HALF_EVEN); // gives me 5.00 instead of 0.05 

так как я буду делать это правильно, всегда получая 2 десятичных знака.

ответ

2

Как и другие, вы можете использовать целые числа для хранения количества центов, но тогда вы можете столкнуться с проблемами, если вы должны вычислить проценты или делить суммы (центов), скажем, на 12 месяцев. Тогда вам может понадобиться более точный промежуточный элемент.

BigDecimals предоставляют все это. Внутри они масштабируются целыми числами, поэтому они обеспечивают все, что вам нужно.

Это довольно просто хранить 5 центов, инициализацию со строкой:

BigDecimal fiveCents = new BigDecimal("0.05"); 

или, вычислительным:

BigDecimal oneCent = new BigDecimal("0.01"); 
BigDecimal fiveCents = BigDecimal.valueOf(5).multiply(oneCent); 

или

BigDecimal fiveCents = BigDecimal.valueOf(5).movePointLeft(2); 

или что-то вам нравится, просто использовать ваше воображение. Но не используйте двойные или плавающие элементы для инициализации BigDecimals, поскольку они могут быть неточными, если они имеют дробную часть. Используйте строки или используйте целые числа, разделите их на 100 или умножьте на одну сотую или переместите десятичную точку слева на 2.

Я видел голоса, которые считают, что использование BigDecimals для представления значений валюты неверно и что вы предпочитаете использовать (масштабированные) целые числа, но BigDecimals - это то, что: масштабированные целые числа. А для «маленьких» чисел (ниже максимального значения) BigDecimals даже используют длинный, а не BigInteger для представления немасштабированного значения.

Не обходите слишком рано, за исключением случаев, когда это требует определенных правил расчета.В противном случае, только раунд (setScale()) в конце.

+0

часть расчета решила его для меня! специально movePointLeft/право .. большое спасибо! –

+0

Если это ответит на ваш вопрос, пожалуйста, примите его как таковое (отметьте v-образную графику рядом с ответом). –

+0

Готово - спасибо за хэдшоп –

0

Храните его как целое число и храните центы. Вы никогда не должны хранить какую-либо денежную оценку как любое плавающее значение.

Таким образом, 0,5% следует хранить как 50 центов. Подсчитайте центы не долларами. Если вы сохраните его в любом значении с плавающей запятой, вы просто просите о проблемах позже со всеми проблемами округления.