Java Kotlin是否有BigDecimal setPrecision实用程序方法?

Java Kotlin是否有BigDecimal setPrecision实用程序方法?,java,kotlin,bigdecimal,Java,Kotlin,Bigdecimal,我在某个地方读到,Java的决策委员会决定,BigDecimal上的setPrecision方法是愚蠢的,因为它已经有了setScale 更愚蠢的是,API用户的代码中有这样的方法: private fun getBigDecimalWith16DigitPrecision(value: BigDecimal): BigDecimal { return when { value < BigDecimal.ONE -> value.setScale(16, Ro

我在某个地方读到,Java的决策委员会决定,
BigDecimal
上的
setPrecision
方法是愚蠢的,因为它已经有了
setScale

更愚蠢的是,API用户的代码中有这样的方法:

private fun getBigDecimalWith16DigitPrecision(value: BigDecimal): BigDecimal {
    return when {
        value < BigDecimal.ONE -> value.setScale(16, RoundingMode.HALF_UP)
        value < BigDecimal(10) -> value.setScale(15, RoundingMode.HALF_UP)
        value < BigDecimal(100) -> value.setScale(14, RoundingMode.HALF_UP)
        value < BigDecimal(1000) -> value.setScale(13, RoundingMode.HALF_UP)
        value < BigDecimal(10000) -> value.setScale(12, RoundingMode.HALF_UP)
        else -> value.setScale(11, RoundingMode.HALF_UP)
    }
}
private fun getBigDecimalWith16DigitPrecision(值:BigDecimal):BigDecimal{
何时返回{
值value.setScale(16,舍入模式,向上舍入)
valuevalue.setScale(15,舍入模式,向上舍入)
valuevalue.setScale(14,舍入模式,向上舍入)
valuevalue.setScale(13,舍入模式,向上舍入)
valuevalue.setScale(12,舍入模式,向上舍入)
else->value.setScale(11,舍入模式,向上舍入)
}
}

它甚至不包括所有情况。

如果您只需要一个更简单(更简洁)的代码版本,那么您可以通过计算比例来简化它(
16-log10(value)
,或
11
,以较大者为准):


这只是一条线,因为您的刻度需要与精度一样精确地改变:

fun BigDecimal.setPrecision(newPrecision: Int) = setScale(scale() + (newPrecision - precision()), RoundingMode.HALF_UP)
或者(更明显,但效率更低):


在我看来,Java委员会欠我10行代码,我现在必须从我可以有效维护的代码总数中减去这些代码,如果
BigDecimal
setPrecision
方法,这会是什么样子?不明白。我想这是一个非常罕见的例子。@ernest_k例如
BigDecimal(“33.23”)。setPrecision(5)=BigDecimal(“33.230”)
BigDecimal(“33.23”)。setPrecision(2)=BigDecimal(“33”)
fun BigDecimal.setPrecision(newPrecision: Int) = setScale(scale() + (newPrecision - precision()), RoundingMode.HALF_UP)
fun BigDecimal.setPrecision(newPrecision: Int) = BigDecimal(toPlainString(), MathContext(newPrecision, RoundingMode.HALF_UP))