2

为什么有一种BigDecimal.setScale()方法可以将小数设置为某个值而没有MathContext.setScale()方法,但只有构造函数MathContext(precision)或其他方式,为什么没有BigDecimal.setPrecision()方法?

编辑:没有方法MathContext.setPrecision(),只有构造函数MathContext(precision)。编辑了文本。对此感到抱歉。

EDIT2:我只是想了解为什么有两种方法可以接近比例/精度设置。似乎没有真正的理由让他们中的两个关于 Richard Sitze 的回答。

看这个例子,它清楚地表明你真的可以在精确和规模上得到奇怪的结果:

MathContext mc = new MathContext(2);
BigDecimal test = new BigDecimal("100.234", mc);
System.out.println("Scale: " + test.scale() + ", value: " + test);
test.setScale(6);
System.out.println("Scale: " + test.scale() + ", value: " + test);
test = test.add(new BigDecimal("100"));
System.out.println("Scale: " + test.scale() + ", value: " + test);

结果是:

Scale: -1, value: 1.0E+2
Scale: -1, value: 1.0E+2
Scale: 0, value: 200

关于设置的结果是正确的,但是当我将比例设置为 6 时,我预计会出现警告/提示/异常,说明精度设置不允许比例为 6。

4

2 回答 2

3

没有方法MathContext.setPrecision(),只有一个非静态的getPrecision()。for 的构造函数用于MathContext设置精度。

如果您参考 的文档BigDecimal,我们有:

BigDecimal 类让用户可以完全控制舍入行为。如果没有指定舍入方式,无法表示准确的结果,则抛出异常;否则,可以通过向操作提供适当的 MathContext 对象来执行所选精度和舍入模式的计算。

从本质上讲,没有理由重新创建轮子——MathContext设计上已经这样做了。

于 2013-08-07T15:53:50.183 回答
2

声明的权力只能通过更改比例(小数点右侧的数字数)来偶然调整整体精度(总位数)。

这是适当的,因为对精度的任何更改都需要对比例进行更改。所以充其量setPrecision是多余的;只setScale产生了一个更干净的 API。

现在考虑对精度的更改以及结果可能需要如何四舍五入。在进行该分析时,您将考虑“四舍五入后应保留多少位数”。那就是规模。因此,任何这样的考虑都会回到应该如何改变尺度的问题。

setScale使用它的变体来指定舍入是很自然的。对于一个假设的setPrecision,它要求代码注释来填补空白(恕我直言),情况就不那么好了。

于 2013-08-07T16:21:12.187 回答