为什么没有BigDecimal.setPrecision()方法?

时间:2013-08-07 15:45:24

标签: java

为什么有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。

2 个答案:

答案 0 :(得分:3)

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

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

  

BigDecimal类使用户可以完全控制舍入   行为。如果未指定舍入模式,则确切的结果不能   被代表,抛出异常;否则,计算可以   通过提供一个选定的精度和舍入模式   适当的MathContext对象来操作。

基本上,没有理由重新创建轮子 - MathContext已经按照设计完成了这项工作。

答案 1 :(得分:2)

声明可以通过更改比例(右边的数字#)偶然调整整体精度(总数字数)的权力小数点)。

这是合适的,因为对精度的任何改变都需要改变比例。 所以最多setPrecision是多余的; 只有setScale才能生成更清晰的API。

现在考虑更改精度以及结果可能需要舍入的方式。 在进行分析时, 你会考虑“四舍五入后应该保留多少位数”。 的比例。 因此,任何这样的考虑都会导致规模如何 应该改变。

setScale及其用于指定舍入的变体是自然的选择。 对于假设的setPrecision而言则较少,这需要代码注释以填补空白(恕我直言)。