如前所述,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
等。这种方法简化并增加了计算,但它并不适用于所有系统。然而,为了这个问题的简单性,我不会深入探讨这个主题。