将Java编号转换为大十进制:最佳方法

2022-08-31 16:14:09

我正在寻找将数字转换为大十进制的最佳方法。

这足够好吗?

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

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


答案 1

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

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

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

0.34999999999999997779553950749686919152736663818359375

因此,我会说您的解决方案可能是最安全的。


答案 2

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

有点。。。两者都只输出小数分隔符后面的位数,这是输出唯一对应于浮点数或双精度值所必需的。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.35true

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