This question already has answers here:
Java BigDecimal precision problems
                                
                                    (5个答案)
                                
                        
                去年关闭。
            
        

Java中有一个BigDecimal数据类型。
当我像这样将数字5190000000声明为BigDecimal时:

BigDecimal a = new BigDecimal(5190000000L * 1.0F);


,它很兴奋,并且可以看到以下输出:

Output:
5190000128


虽然我省略了F作为浮点值,这是正确的,如下所示:

BigDecimal a = new BigDecimal(5190000000L * 1.0);

Output:
5190000000


它是什么? F参数怎么会出错?我真的很困惑!!!!

编辑

jdk的版本是1.8

最佳答案

在构造BigDecimal之前,首先需要对方括号内的表达式求值。

因此,5190000000 * 1.0F的值取值为float,但该值不完全是5190000000。为什么?因为无法在float中准确表示5190000000。在创建BigDecimal之前,某些精度已经丢失。因此,您看到的输出不准确。

在第二种情况下,5190000000 * 1.0被评估为double,并且double具有足够的精度以准确表示5190000000。您可能会问,为什么这次将其评估为double?因为1.0F是浮点文字,而1.0是双精度文字。这决定了表达式的类型。

要获取准确的值,请使用字符串构造函数:

BigDecimal bd = new BigDecimal("5190000000");
bd = bd.multiply(BigDecimal.ONE); // if you insist on multiplying it by 1

09-11 17:16