如何在不使用双精度的情况下使用BigDecimal

时间:2016-03-14 15:36:44

标签: android sqlite bigdecimal

我正在尝试制作这个程序,你可以买到一些不同的物品。

我将我的价格存储在一个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 个答案:

答案 0 :(得分: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,或乘以百分之一或将小数点向左移动。

我看到有人认为使用BigDecimals来表示货币值是错误的,而你更倾向于使用(缩放的)整数,但BigDecimals恰恰是:缩放整数。对于“小”数字(低于最大长值),BigDecimals甚至使用long而不是BigInteger来表示未缩放的值。

除非某些计算规则要求,否则不要太早结束。否则,最后只有圆(setScale())。

答案 1 :(得分:0)

将其存储为整数并存储分数。您永远不应将任何货币价值存储为任何浮动值。

所以0.5美元应存储为50美分。数仙而不是美元。如果将它存储在任何浮点值中,您只是在以后遇到所有舍入问题时遇到麻烦。