android - 如何在不使用 double 的情况下使用 BigDecimals

标签 android sqlite bigdecimal

我正在尝试制作这个程序,让您可以购买一些不同的元素。

我将我的价格存储在一个 sqlite 数据库中(除了它是字符串或整数之外,还没有决定数据类型)。

我已经阅读了 2 个小时,试图掌握这一点,我理解为什么我不能使用 double 值或浮点值。

但我无法决定:我应该将价格存储为整数吗?或字符串。

我在这里看到的问题是,我总是被告知不要将整数存储为字符串.. 现在人们告诉我这很聪明,因为这是我保持价格准确性的唯一方法?

如果我将它们存储为整数,我将遇到以下问题:

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

我如何在不使用 double 的情况下做到这一点??

或者也许有一种方法可以用 BigDecimals 做到这一点?

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

那么我将如何正确地做到这一点,总是得到 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);

或者任何你喜欢的,只要发挥你的想象力。但是不要使用 double 或 float 来初始化 BigDecimals,因为当它们有小数部分时它们可能不准确。使用字符串或使用整数除以100,或乘以百分之一或将小数点左移2。

我看到有人认为使用 BigDecimals 表示货币值是错误的,并且您宁愿使用(缩放的)整数,但 BigDecimals 正是:缩放的整数。对于“小”数字(低于最大 long 值),BigDecimals 甚至使用 long 而不是 BigInteger 来表示未缩放的值。

不要过早四舍五入,除非某些计算规则要求这样做。否则,只在最后舍入 (setScale())。

关于android - 如何在不使用 double 的情况下使用 BigDecimals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35991820/

相关文章:

java - 编写自定义代码来计算 BigDecimal 幂

android - 如何获取 Android AAB 文件的 versionCode 和 versionName(标记)?

android - 如何使用 OpenCV 在 Android 中设置相机分辨率?

mysql - 数据库存储在共享驱动器上

java - 如何在 Android 中自定义适配器?

sql - SQL查询麻烦SQLite

java - 为什么在转换为 BigDecimal 时带有前导符号(加号或减号)的数字在 Java 中被视为有效数字?

ruby - 某些 BigDecimal 无法使用 ** 运算符计算

Android 标签 fragment

java - Firebase,从所有文档中获取数组列表字段