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

时间:2013-04-25 13:36:20

标签: java numbers precision bigdecimal

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

这还不错吗?

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

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

3 个答案:

答案 0 :(得分:33)

这很好,请记住,使用BigDecimal的构造函数来声明值时,如果它不是String类型,则会很危险。考虑以下......

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

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

0.34999999999999997779553950749686919152736663818359375

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

答案 1 :(得分:18)

我们可以使用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

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

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

答案 2 :(得分:0)

最好的方法是

BigDecimal.valueOf(myDouble);

内部相同,但是它是一个重载函数,也适用于long s,并且针对常用的long s值进行了优化。 因此,它更加标准,简单且易于记忆。

Source