我了解到我不能使用浮点类型(float
/double
在Java中)进行金钱计算(以及当我需要精确结果时的任何其他计算)。我必须使用decimal
数字类型(BigDecimal
在 Java 中)代替。
现在我想知道当我can使用浮点类型。他们提供任何精度保证吗?假设我想精确计算一些公式0.001
。我如何知道是否可以使用浮点类型进行此计算?
当您能够证明结果对于您的应用程序来说可以接受时,您可以在 Java 或其他语言中使用浮点类型。
使用 BigDecimal 本身并不能解决这个问题。例如,假设银行帐户包含 87.34 美元,并且您必须在年利率为 2.37% 的情况下添加一个月的利息。首先,BigDecimal 将无法正确计算月利率,因为您必须将 2.37% 除以 12,而 2.37/12(或 .0237/12)不能精确地用十进制表示。其次,即使 BigDecimal 确实正确计算了月利率,并正确计算了 87.34 美元的利息,您可能仍然需要将该金额四舍五入到一定数量的美分,然后再将其添加到余额中。该舍入规则可能在某些法律文档中指定,并且可能与 BigDecimal 的舍入方式不匹配。
十进制浮点和二进制浮点都能够精确地计算许多结果,比您在示例中建议的 0.001 精度精确得多。当以各种方式使用时,两者都能够产生严重的错误。
因此,要使用浮点,您必须了解这些类型可以表示哪些值、浮点运算中会发生哪些错误、您将执行哪些操作以及您的应用程序需要什么。通常,可以通过仔细设计操作来避免浮点错误。例如,您可以通过将金额缩放为整数值来处理货币(使用 8734 表示 $87.34,而不是使用 87.34 表示 87.34)。作为另一个示例,您可以证明几次操作的累积误差小于半美分,因此您可以执行操作并将最终结果四舍五入到最接近的美分,这将是正确的,因为误差永远不够大使最终答案不正确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)