java BigDecimal 存储垃圾值的问题

Vik*_*ngh 2 java bigdecimal double-precision

    BigDecimal b = new BigDecimal(0.05);
    System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

输出:

    0.05000000000000000277555756156289135105907917022705078125
Run Code Online (Sandbox Code Playgroud)

这要怎么处理呢?

Pet*_*rey 5

这个数字是严格正确的。这是 double 的精确值 0.05。这是因为double无法准确表示所有值,而必须为您提供最接近的可表示值。当您打印该值时,它假设您想要对其进行舍入,并隐藏表示错误。BigDecimal 只是向您展示其真正的值。

如果您想从 double 转换为 BigDecimal 并按照您期望的方式使用

BigDecimal b = BigDecimal.valueOf(0.05);
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是不使用 BigDecimal。如果您使用double适当的舍入,您将得到相同的答案,并且代码少得多,代码快得多。