Java bignumber的BigDecimal在浮点值中无法正常工作
java中有一个Java bignumber的BigDecimal在浮点值中无法正常工作,java,bigdecimal,Java,Bigdecimal,java中有一个BigDecimal数据类型。 当我将数字5190000000声明为BigDecimal时,如下所示: BigDecimal a = new BigDecimal(5190000000L * 1.0F); BigDecimal a = new BigDecimal(5190000000L * 1.0); Output: 5190000000 ,它被激发,可以看到以下输出: Output: 5190000128 虽然我将F作为浮点值,但它是正确的,如下所示: BigDeci
BigDecimal
数据类型。
当我将数字5190000000声明为BigDecimal时,如下所示:
BigDecimal a = new BigDecimal(5190000000L * 1.0F);
BigDecimal a = new BigDecimal(5190000000L * 1.0);
Output:
5190000000
,它被激发,可以看到以下输出:
Output:
5190000128
虽然我将F作为浮点值,但它是正确的,如下所示:
BigDecimal a = new BigDecimal(5190000000L * 1.0F);
BigDecimal a = new BigDecimal(5190000000L * 1.0);
Output:
5190000000
这是什么?那么F参数怎么会出错呢?我真的很困惑
编辑
jdk的版本是1.8您不应该使用
double
构造函数创建BigDecimal
。由于您要传递的双精度
(在本例中是浮点
)一开始就不精确,因此不精确将反映在大十进制
中
建议您使用
BigDecimal
的String
或long
构造函数或valueOf
工厂方法初始化BigDecimal
,因为它们更可能保持您所需的精度。您不应该使用double
构造函数创建BigDecimal
。由于您要传递的双精度
(在本例中是浮点
)一开始就不精确,因此不精确将反映在大十进制
中
建议您使用
BigDecimal
的String
或long
构造函数或valueOf
工厂方法来初始化BigDecimal
,因为它们更有可能保持您所需的精度。这是预期的行为。表达式5190000000*1.0F
计算为浮点,其精度只有6到7位小数
实际上,最终得到的值精确到7位。这是预期行为。表达式
5190000000*1.0F
计算为浮点,其精度只有6到7位小数
实际上,最终得到的值精确到7位。原因
-BigDecimal的构造方法,参数类型为double。
-所以,您的第一个代码将由编译器进行隐式转换,这将使一些问题失去准确性。
-但是,您的第二个代码“1.0”的默认类型是double,因此这是正确的。
-另外,int类型的最大值是2147483647,您设置的参数是5190000000,这将导致编译错误。原因
-BigDecimal的构造方法,参数类型为double。
-所以,您的第一个代码将由编译器进行隐式转换,这将使一些问题失去准确性。
-但是,您的第二个代码“1.0”的默认类型是double,因此这是正确的。
-另外,int类型的最大值是2147483647,您设置的参数是5190000000,这将导致编译错误。在构建
BigDecimal
之前,需要首先计算括号内的表达式
因此,5190000000*1.0F
被计算为一个float
值,但该值并不完全是5190000000。为什么?因为5190000000不能在float
中准确表示。在创建BigDecimal
之前,某些精度已经丢失。因此,您看到的输出不准确
在第二种情况下,5190000000*1.0
被计算为double
,并且double
具有足够的精度来精确表示5190000000。您可能会问,为什么这次它的计算结果是双精度的。因为1.0F
是浮点文本,1.0
是双文本。这决定了表达式的类型
要获得准确的值,请使用字符串构造函数:
BigDecimal bd = new BigDecimal("5190000000");
bd = bd.multiply(BigDecimal.ONE); // if you insist on multiplying it by 1
在构造BigDecimal
之前,需要首先计算括号内的表达式
因此,5190000000*1.0F
被计算为一个float
值,但该值并不完全是5190000000。为什么?因为5190000000不能在float
中准确表示。在创建BigDecimal
之前,某些精度已经丢失。因此,您看到的输出不准确
在第二种情况下,5190000000*1.0
被计算为double
,并且double
具有足够的精度来精确表示5190000000。您可能会问,为什么这次它的计算结果是双精度的。因为1.0F
是浮点文本,1.0
是双文本。这决定了表达式的类型
要获得准确的值,请使用字符串构造函数:
BigDecimal bd = new BigDecimal("5190000000");
bd = bd.multiply(BigDecimal.ONE); // if you insist on multiplying it by 1
我需要浮点值,我如何用浮点值初始化bigdecimal?你能发送一些例子吗?你不能。您的float
中的数字太大,无法精确表示,因此以这种方式创建BigDecimal
时,它将永远不会具有正确的值。如何解决我的问题?你的想法是什么?我的想法是不要对这么大的数字使用float
。使用一个double
来代替。我需要浮点值,如何用浮点值初始化bigdecimal?你能发送一些示例吗?你不能。您的float
中的数字太大,无法精确表示,因此以这种方式创建BigDecimal
时,它将永远不会具有正确的值。如何解决我的问题?你的想法是什么?我的想法是不要对这么大的数字使用float
。使用double
代替。我需要浮点值,如何解决问题?我需要浮点值,如何解决问题?