我正在寻找将数字转换为BigDecimal的最佳方法。
这还不错吗?
Number number;
BigDecimal big = new BigDecimal(number.toString());
我们可以使用toString()
方法失去精确度吗?
答案 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值进行了优化。
因此,它更加标准,简单且易于记忆。