将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实例中的精确等价物表示。