有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Kotlin有BigDecimal setPrecision实用程序方法吗?

我在某个地方读到,Java的决策委员会认为setPrecision上的BigDecimal方法是愚蠢的,因为它已经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)
    }
}

这甚至不包括所有的案例


共 (2) 个答案

  1. # 1 楼答案

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

    return value.setScale((int) Math.max(11, 16 - Math.log10(value.doubleValue())),
                          RoundingMode.HALF_UP);
    
  2. # 2 楼答案

    这只是一条线,因为你的刻度需要和精度一样变化:

    fun BigDecimal.setPrecision(newPrecision: Int) = setScale(scale() + (newPrecision - precision()), RoundingMode.HALF_UP)
    

    或者(更明显,但效率更低):

    fun BigDecimal.setPrecision(newPrecision: Int) = BigDecimal(toPlainString(), MathContext(newPrecision, RoundingMode.HALF_UP))