Mic*_*ael 4 java math floating-point computer-architecture
我知道我不能使用浮点类型(float/ double在Java中)来进行货币计算(以及当我需要精确结果时的任何其他计算).我必须使用decimal数字类型(BigDecimal在Java中).
现在,我可以使用浮点类型.他们提供任何精确保证吗?假设我想精确计算一些公式0.001.我怎么知道我是否可以使用浮点类型进行此计算?
当您可以演示应用程序可接受的结果时,您可以使用Java或其他语言的浮点类型.
使用BigDecimal本身并不能解决这个问题.例如,假设一个银行账户包含87.34美元,并且您必须在一年内增加利息,并且年利率为2.37%.首先,BigDecimal不会正确计算月利率,因为您必须将2.37%除以12,并且2.37/12(或.0237/12)不能用十进制表示.其次,即使BigDecimal确实正确地计算了月利率,并且正确地计算了87.34美元的利息,您可能仍然需要将该数额四舍五入到一定数量的美分才能将其添加到余额中.可以在某些法律文档中指定该舍入的规则,并且可能与BigDecimal舍入的方式不匹配.
十进制浮点和二进制浮点都能够精确计算许多结果,比您在示例中建议的.001精度更精确.当以各种方式使用时,两者都能够产生显着的错误.
因此,要使用浮点数,您必须了解类型可以表示的值,浮点运算中发生的错误,要执行的操作以及应用程序所需的操作.通常,可以通过仔细制作操作来避免浮点错误.例如,您可以通过将金额缩放为整数值来处理货币(使用8734表示$ 87.34而不是使用87.34表示87.34).作为另一个例子,您可以证明来自多个操作的累积误差小于半分,因此您可以执行操作并将最终结果舍入到最接近的分数,这将是正确的,因为错误从未足够大使最终答案不正确.