56

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

这够好吗?

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

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

4

4 回答 4

37

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

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

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

0.34999999999999997779553950749686919152736663818359375

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

于 2013-04-25T13:39:22.763 回答
21

我们可以使用 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 实例中的精确等价物表示。

于 2013-04-25T13:54:35.110 回答
0

最好的方法是

BigDecimal.valueOf(myDouble);

它在内部是相同的,但它是一个重载函数,也适用于longs 并且针对常用long的 s 值进行了优化。所以它更标准、更简单、更容易记住。

资源

于 2019-07-24T08:04:16.353 回答
0

我认为这是将 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());
    }
于 2021-10-20T07:53:26.320 回答