This question already has answers here:
Java BigDecimal precision problems
(5个答案)
去年关闭。
Java中有一个
当我像这样将数字5190000000声明为BigDecimal时:
,它很兴奋,并且可以看到以下输出:
虽然我省略了F作为浮点值,这是正确的,如下所示:
它是什么? F参数怎么会出错?我真的很困惑!!!!
编辑
jdk的版本是1.8
(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