为什么有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。
答案 0 :(得分:3)
没有方法MathContext.setPrecision()
,只有非静态getPrecision()
。 MathContext
的构造函数是用于设置精度的构造函数。
如果您参考BigDecimal
的文档,我们有:
BigDecimal类使用户可以完全控制舍入 行为。如果未指定舍入模式,则确切的结果不能 被代表,抛出异常;否则,计算可以 通过提供一个选定的精度和舍入模式 适当的MathContext对象来操作。
基本上,没有理由重新创建轮子 - MathContext
已经按照设计完成了这项工作。
答案 1 :(得分:2)
声明可以通过更改比例(右边的数字#)偶然调整整体精度(总数字数)的权力小数点)。
这是合适的,因为对精度的任何改变都需要改变比例。
所以最多setPrecision
是多余的;
只有setScale
才能生成更清晰的API。
现在考虑更改精度以及结果可能需要舍入的方式。 在进行分析时, 你会考虑“四舍五入后应该保留多少位数”。 的比例。 因此,任何这样的考虑都会导致规模如何 应该改变。
setScale
及其用于指定舍入的变体是自然的选择。
对于假设的setPrecision
而言则较少,这需要代码注释以填补空白(恕我直言)。