我正在编写一个非常简单的类,并且正在努力进行一些小数除法。
所以这不是很好的代码,但是......
class Rational (val numerator: BigInteger, val denominator: BigInteger) : Comparable <Rational> {
//ATTEMPT 1
//val decimalRepresentation: BigDecimal = (numerator.toBigDecimal().div(denominator.toBigDecimal()))//.setScale(5)
//ATTEMPT 2
val decimalRepresentation = (BigDecimal(numerator).div(BigDecimal(denominator))) //.setScale(5)
override fun compareTo(other: Rational): Int {
val a = BigDecimal(1.0)
val b = BigDecimal(2.0)
val x = a.divide(b) // 0.5
println ("x: " + x.toString())
println("this val: " + this.decimalRepresentation)
println("other val: " + other.decimalRepresentation)
return when {
...
}
}
所以我尝试了两种将 BigIntegers 转换为 BigDecimals 进行比较的方法,但都失败了,数学执行整数除法
所以
1/3 = 0
5/6 = 1
我已经做了一个 poc,以防我发疯,而且 x 是 0.5。
谁能告诉我如何解决这个问题(无需更改参数类型或转换为字符串并返回!)
奇怪的是 1/2 也返回 0,这对我来说似乎很奇怪,因为我希望 0.5 舍入为 1 ?这让我担心我在某个地方完全错过了一个非常简单的点!
最佳答案
问题之一在于 BigDecimal.div
。它使用 RoundingMode.HALF_EVEN以及所使用的被除数 BigDecimal
的给定 scale
(文档中也有说明)。另一个问题是 BigInteger
到 BigDecimal
的转换首先将小数位数设置为 0(另请检查 BigDecimal(BigInteger)
),因此它将在不使用十进制数字的情况下进行舍入。
另请注意,在您的示例中,您使用了 a.divide(b)
和两个 BigDecimal
首先,在实际转换中您使用了 a.div(b )
和两个 BigInteger
转换的 BigDecimal
。这是一个完全不同的故事;-)
您可以通过以下方法之一解决您的问题:
使用 toBigDecimal
转换您的 BigInteger
并指定所需的比例
,例如:
val scale = 10 // decimal digits
val decimalRepresentation = numerator.toBigDecimal(scale) / denominator.toBigDecimal(scale)
或者您可能想使用divide
来代替并传递所需的比例:
val decimalRepresentation = BigDecimal(numerator).divide(BigDecimal(denominator), 2, RoundingMode.HALF_UP)
在本例中,我使用了 2 位十进制数字,即 rounding up on half (RoundingMode.HALF_UP
) .
关于java - Kotlin BigInteger 到 BigDecimal 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53262639/