将Java Number转换为BigDecimal:最好的方法

52 java precision numbers bigdecimal

我正在寻找将数字转换为BigDecimal的最佳方法.

这够好吗?

Number number;
BigDecimal big = new BigDecimal(number.toString());
Run Code Online (Sandbox Code Playgroud)

我们可以用这种toString()方法失去精确度吗?

dav*_*rld 34

这很好,请记住,当它不是String类型时,使用BigDecimal的构造函数声明一个值可能很危险.考虑以下......

BigDecimal valDouble = new BigDecimal(0.35);
System.out.println(valDouble);
Run Code Online (Sandbox Code Playgroud)

这不会打印0.35,它实际上是......

0.34999999999999997779553950749686919152736663818359375
Run Code Online (Sandbox Code Playgroud)

我会说你的解决方案可能是最安全的.


jar*_*bjo 19

我们可以用toString()方法丢失精度吗?

种,两种Float.toString()Double.toString()只输出的数字的小数分隔,这是需要的输出唯一地以对应于浮动或双值后的数目.

要在david99world的答案中使用0.35示例,请考虑以下代码:

BigDecimal bd1 = new BigDecimal(0.35);

Number n = 0.35;
BigDecimal bd2 = new BigDecimal(n.toString());

System.out.println(bd1);
System.out.println(bd2);
Run Code Online (Sandbox Code Playgroud)

直观的期望可能是两个BigDecimal实例是相同的,但输出显示它们不是:

0.34999999999999997779553950749686919152736663818359375
0.35
Run Code Online (Sandbox Code Playgroud)

第一行是double的精确值,因为0.35无法准确表示.第二行是0.35,因为不需要更多的小数位来表示不同的值.例如,该声明0.34999999999999997779553950749686919152736663818359375 == 0.35将评估为true.

创建BigDecimal时,这实际上并不是精度的损失,不确定性已存在于您的"源"值中.问题在于,使用例如float或double值作为源可能的离散值不一定由BigDecimal实例中的精确等价物表示.

  • 这是一个非常好的观点,但在您的简单示例中,“toString”结果实际上更可取,因为它提供了您在代码中键入的文字数字,就像您执行了“new BigDecimal("0.35")”一样。是否存在“toString”方法实际上会出现问题的情况? (2认同)