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

Java 为什么没有BigDecimal.setPrecision()方法?,java,Java,为什么有一个BigDecimal.setScale()方法将小数设置为某个值,而没有MathContext.setScale()方法,但只有一个构造函数MathContext(precision)或者其他方法,为什么没有BigDecimal.setPrecision()方法 编辑: 没有方法MathContext.setPrecision(),只有构造函数MathContext(precision)。编辑文本。对不起 编辑2: 我只是想了解为什么有两种方法可以接近刻度/精度设置。关于理查德·西泽

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

编辑: 没有方法
MathContext.setPrecision()
,只有构造函数
MathContext(precision)
。编辑文本。对不起

编辑2: 我只是想了解为什么有两种方法可以接近刻度/精度设置。关于理查德·西泽的答案,似乎没有真正的理由让他们中的两个来回答

请参阅此示例,它清楚地表明,您确实可以使用精度和比例播放奇怪的结果:

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。

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

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

BigDecimal类为用户提供了对舍入的完全控制 行为。如果未指定舍入模式,则无法获得准确的结果 表示时,抛出异常;否则,计算可能会失败 通过提供 操作的适当MathContext对象


本质上,没有理由重新创建轮子--
MathContext
已经设计好了

声明总精度(总位数)的幂只能通过改变小数点右侧的小数位数来偶然调整

这是适当的,因为对精度的任何更改都需要对比例进行更改。 因此,至多
setPrecision
是冗余的; 只有
setScale
的API更干净

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

setScale
及其用于指定舍入的变体是一种自然匹配。
对于一个假设的
setPrecision
,它需要代码注释来填补空白(IMHO)。

你必须问谁写了
BigDecimal
。你想通过问这个问题来解决什么特别的问题?@SteveP。可以将精度设置为MathContext构造函数参数。MathContext是不可变的,所以根本没有setXXX方法。@Steve P:你说得对,Steve,你只能在构造函数中传递精度,但问题仍然是一样的:),因为它是不可变的。