如前所述,BigDecimal如果您需要更好的双打精度,这是一个不错的选择。
用 s 进行舍入有很好的方法BigDecimal。基本上你必须指定BigDecimal实例的规模。看看这个示例代码:
BigDecimal decimalOne = new BigDecimal(0.1950);
BigDecimal decimalTwo = decimalOne.setScale(2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal decimalThree = decimalOne.setScale(4, BigDecimal.ROUND_HALF_DOWN);
System.out.println("decimalOne: " + decimalOne);
System.out.println("decimalTwo: " + decimalTwo);
System.out.println("decimalThree: " + decimalThree);
Java 7 会打印如下内容:
decimalOne: 0.195000000000000006661338147750939242541790008544921875
decimalTwo: 0.20
decimalThree: 0.1950
请注意,BigDecimal实例是不可变的,这就是为什么您必须将结果分配setScale给新实例(decimalOne不会更改)。
在许多金融系统double中不用于存储货币信息;long使用具有特定精度的类型,例如精度为 2,值100将是1.00,122将是1.22等。这种方法简化并增加了计算,但它并不适用于所有系统。然而,为了这个问题的简单性,我不会深入探讨这个主题。