有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用双Java精确计算选项

我试图简要介绍一下JAVA+SQL中的精确计算选项。到目前为止,我发现了以下几种选择:

  1. 使用替身,接受他们的缺点,不可以
  2. 使用大小数
    • 在复杂的公式中使用它们对我来说是有问题的
  3. 使用字符串。格式/十进制。双打格式
    • 我需要对公式中的每个变量进行四舍五入,还是只对结果进行四舍五入,以获得更大的十进制精度
    • 如何调整
  4. 在SQL中使用计算字段选项。
    • 缺点是,我需要动态SQL来从不同的表中提取数据,并在其他计算字段中提取计算字段,这会变得很混乱

还有其他选择吗

问题陈述: 我需要精确的财务计算,包括使用非常大(十亿)和非常小的数字(0.0000004321),以及相互非常相似的值的除法,所以我当然需要BigDecimal的精度

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

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

非常感谢您对如何处理这些东西的建议


共 (4) 个答案

  1. # 1 楼答案

    浮点双精度中,您无法避免浮点错误。 这里没有免费奶酪——使用BigDecimal

  2. # 2 楼答案

    摘自《有效Java》(第二版):

    Item 48: Avoid float and double if exact answers are required

    • Float and double do not provide exact results and should not be used where exact results are required. The float and double types are particularly ill-suited for monetary claculations because is impossible to represent 0.1 (or any other negative power of ten) as a float or double exactly.

    • The right way to solve this problem is to ouse BigDecimal, int, or long for monetary calculations.

    ...

    An alternative is to use int or long and to keep track of the decimal point yourself.

  3. # 3 楼答案

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

  4. # 4 楼答案

    无法在double上获得BigDecimal精度double具有双重精度

    如果你想保证精确的结果,可以使用BigDecimal

    你可以用一个long来存储整数部分,用一个int来存储小数部分,来创建你自己的变体,但是为什么要重新发明轮子呢

    任何时间使用double都可以避免填充器出现双精度问题。如果你在一个地方使用它们,你也可以在任何地方使用它们

    即使只使用它们来表示数据库中的数据,也会将数据四舍五入到两倍精度,从而丢失信息