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

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

这足够好吗?

Number number; BigDecimal big = new BigDecimal(number.toString()); 

我们可以通过toString()方法失去精度吗?

这很好,请记住,使用BigDecimal的构造函数来声明一个值时,如果它不是Stringtypes的,那么它可能会很危险。 考虑下面…

 BigDecimal valDouble = new BigDecimal(0.35); System.out.println(valDouble); 

这不会打印0.35,事实上是…

 0.34999999999999997779553950749686919152736663818359375 

我想说你的解决scheme可能是最安全的。

我们可以通过toString()方法失去精度吗?

种类… Float.toString()Double.toString()只输出小数点分隔符后的位数,这是输出唯一对应于float或double值所需的位数。

要使用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); 

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

 0.34999999999999997779553950749686919152736663818359375 0.35 

第一行是双精度值,因为0.35不能精确表示。 第二行是0.35,因为不需要更多的小数来表示不同的值。 例如声明0.34999999999999997779553950749686919152736663818359375 == 0.35将评估为true

在创buildBigDecimal时,这实际上不是精确度的损失,不确定性已经存在于“源”值中。 问题是,可能使用浮点数或双精度值作为源的离散值不一定会由BigDecimal实例中的精确等价物表示。