Kotlin 中的小数乘法

Ewa*_*ine 1 java floating-point double bigdecimal kotlin

我正在尝试将两种加密货币相乘,例如它们的数字0.002000.00300。我已经将它们定义为浮点数,我也尝试过双打和大小数。但我正在努力获得我期望的输出。

这是测试:

class MultiplyDecimalTest {

    @Test
    fun `test can multiply two decimal integers`() {
        val a = 0.00200
        val b = 0.00400
        val expected = 0.00800
        val actual = multiplyDecimal(a, b).toDouble()
        assertEquals(expected, actual)
    }
}
Run Code Online (Sandbox Code Playgroud)

当前功能:

fun multiplyDecimal(a: Double, b: Double): BigDecimal {
    return BigDecimal(b).multiply(BigDecimal(a))
}
Run Code Online (Sandbox Code Playgroud)

我是 Kotlin/Java 的新手,所以我怀疑我可能使用了错误的整数类型。

实际结果是:8.0E-6- 我知道 E-6 是一个指数,我希望能够像原始值一样格式化它。

Lou*_*man 5

的一个关键部分BigDecimal是,你必须使用它通过字面的整个方式:通过Double进入BigDecimal破阵,你会从中获取任何利益BigDecimal

您必须使用带有String,BigDecimal("0.00200")BigDecimal("0.00400"), 和引号的构造函数。然后打电话multiply给他们。你不能要求doubleValue()结果。

平等测试BigDecimal也增加了复杂性,需要完全相同的规模。考虑compareTo像这样使用,assertTrue(expected.compareTo(actual) == 0)

另一个问题:你的数学不正确。0.00200 * 0.00400 = 0.000008 而不是 0.00800。

BigDecimal在避免时使用的示例代码Double。在 Java 语法中。更正了您的输入。

var a = "0.002000" ;
var b = "0.004000" ;
var expected = "0.000008" ;

var actual = new BigDecimal( a ).multiply( new BigDecimal( b ) ) ;
actual = actual.setScale( new BigDecimal( a ).scale() ) ;  // Set scale of result to match the scale of inputs.
boolean matching = actual.equals( new BigDecimal( expected ) ) ;
Run Code Online (Sandbox Code Playgroud)

查看此代码在 IdeOne.com 上实时运行

实际:实际:0.000008

匹配:真