我正在寻找将数字转换为 BigDecimal 的最佳方法。
这够好吗?
Number number;
BigDecimal big = new BigDecimal(number.toString());
toString()
我们可以用这种方法失去精度吗?
我正在寻找将数字转换为 BigDecimal 的最佳方法。
这够好吗?
Number number;
BigDecimal big = new BigDecimal(number.toString());
toString()
我们可以用这种方法失去精度吗?
这很好,请记住,使用 BigDecimal 的构造函数来声明一个不是 String 类型的值可能会很危险。考虑以下...
BigDecimal valDouble = new BigDecimal(0.35);
System.out.println(valDouble);
这不会打印 0.35,它实际上是......
0.34999999999999997779553950749686919152736663818359375
我会说你的解决方案可能是最安全的。
我们可以使用 toString() 方法失去精度吗?
Kind of ... 两者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);
一个直观的预期可能是两个 BigDecimal 实例是相同的,但输出显示它们不是:
0.34999999999999997779553950749686919152736663818359375
0.35
第一行是双精度的准确值,因为 0.35 不能准确表示。第二行是 0.35,因为不再需要小数位来表示不同的值。例如,该语句0.34999999999999997779553950749686919152736663818359375 == 0.35
将评估为true
。
在创建 BigDecimal 时,这实际上并不是精度损失,您的“源”值中已经存在不确定性。问题在于,可能使用例如浮点数或双精度值作为源的离散值不一定会由 BigDecimal 实例中的精确等价物表示。
最好的方法是
BigDecimal.valueOf(myDouble);
它在内部是相同的,但它是一个重载函数,也适用于long
s 并且针对常用long
的 s 值进行了优化。所以它更标准、更简单、更容易记住。
我认为这是将 Number 转换为 BigDecimal 的最佳方法:
public static BigDecimal convertToBigDecimal(Number number) {
if (number instanceof Integer
|| number instanceof Long
|| number instanceof Short
|| number instanceof Byte) {
return BigDecimal.valueOf(number.longValue());
}
return BigDecimal.valueOf(number.doubleValue());
}