java - Kotlin BigInteger 到 BigDecimal 转换

标签 java kotlin biginteger bigdecimal

我正在编写一个非常简单的类,并且正在努力进行一些小数除法。

所以这不是很好的代码,但是......

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(文档中也有说明)。另一个问题是 BigIntegerBigDecimal 的转换首先将小数位数设置为 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/

相关文章:

java - 智能算法在范围内随机化 Double 但有赔率

java - Android:如何从代码中禁用所有第三方应用程序通知的声音?

algorithm - 唐叶算法

java - GUI 可以并行检查大量数据的原始性

java - 正则表达式数组列表

java - 如何指定要调用类的哪个构造函数?

java - matlab javaclasspath() 在 Mac 上不起作用

android - 可能通过 InterationListener 从适配器调用 Intent

java - 在 HttpServer 处理程序中使用 if 语句

帕斯卡中的大整数