考虑下面的代码:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class RoundingTests {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal(265.345d);
BigDecimal bd2 = new BigDecimal(265.335d);
System.out.println("Setting scale 265.345: " + bd1.setScale(2, RoundingMode.HALF_EVEN));
System.out.println("Setting scale 265.335: " + bd2.setScale(2, RoundingMode.HALF_EVEN));
}
}
输出结果为:
Setting scale 265.345: 265.35
Setting scale 265.335: 265.33
现在这正好是我所不希望的。使用
RoundingMode.HALF_EVEN
(也称为银行家舍入)时,我期望这两个值都变成265.34
。请注意,我故意没有使用
BigDecimal.round
方法,因为它也不能满足我的需求。如果我添加此代码(并导入java.math.MathContext):System.out.println("Rounding 265.345: " + bd1.round(new MathContext(2, RoundingMode.HALF_EVEN)));
System.out.println("Rounding 265.335: " + bd2.round(new MathContext(2, RoundingMode.HALF_EVEN)));
然后输出结果为:
Rounding 265.345: 2.7E+2
Rounding 265.335: 2.7E+2
这是可以预料的,也在BigDecimal setScale and round中解释过,但这意味着它基本上对我的目的毫无用处。
有人能解释一下setScale的问题吗?
更新:所以这只是另一个浮点数问题,没有简单的方法来修复它,除了从一开始就使用BigDecimals。