Java bignumber的BigDecimal在浮点值中无法正常工作

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

java中有一个
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
代替。我需要浮点值,如何解决问题?我需要浮点值,如何解决问题?