2

我正在尝试对我们在 JAVA+SQL 中的精确计算选项建立一些简明的概述。到目前为止,我找到了以下选项:

  1. 使用双打接受他们的缺点,不行。
  2. 使用 BigDecimals
    • 在复杂的公式中使用它们对我来说是有问题的
  3. 使用 String.format/Decimal.format 舍入双精度数
    • 我需要对公式中的每个变量进行四舍五入还是只获得 BigDecimal 精度?
    • 如何调整?
  4. 在 SQL 中使用计算字段选项。
    • 缺点是我需要动态 SQL 从不同的表中提取数据 + 计算其他计算字段上的字段,这会变得混乱

还有其他选择吗?

问题陈述:我需要精确的财务计算,这将涉及使用非常大(十亿)和非常小的数字(0.0000004321),并且还划分彼此非常相似的值,所以我肯定需要 BigDecimal 的精度。

另一方面,我想保留双精度在函数中的易用性(我处理来自十进制 SQL 数据的数组),因此计算如下:(a[i] - b[i])/b[i] 等。等在其他计算中进一步使用。我希望用户能够根据需要设计自己的公式(使用常见的数学语句)

我热衷于对 String.format 使用“格式化”解决方案,但这使得代码的可读性不太好(对每个变量使用 String.format()...)。

非常感谢关于如何处理这些东西的建议。

4

4 回答 4

2

您无法采取任何措施来避免floatdouble的浮点错误。这里没有免费的奶酪 - 使用 BigDecimal。

于 2013-04-26T10:29:54.460 回答
2

来自Effective Java(第 2 版):

第 48 条:如果需要准确的答案,请避免使用 float 和 double

  • Float 和 double 不提供准确的结果,不应在需要准确结果的地方使用。float 和 double 类型特别不适合货币计算,因为不可能将 0.1(或任何其他 10 的负幂)精确地表示为 float 或 double。

  • 解决这个问题的正确方法是使用 BigDecimal、int 或 long 进行货币计算。

...

另一种方法是使用 int 或 long 并自己跟踪小数点。

于 2013-04-26T10:33:42.533 回答
0

没有办法BigDecimaldouble. doubles 具有双精度。

如果您想保证精确的结果,请使用BigDecimal.

可以long使用 a来存储整数部分和 an来存储小数部分来创建自己的变体int- 但为什么要重新发明轮子。

任何时候使用doubles,您都可以避免双精度问题。如果你在一个地方使用它们,你不妨在任何地方使用它们。

即使您仅使用它们来表示数据库中的数据,也会将数据四舍五入为双精度,并且您将丢失信息。

于 2013-04-26T10:29:18.773 回答
0

如果我理解您的问题,您希望使用比本地 Java 更精确的数据类型,而不会丢失简单的数学语法(例如 / + * - 等等)。由于您不能在 Java 中重载运算符,我认为这是不可能的。

于 2013-04-26T10:30:26.477 回答