首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin中的乘法小数

Kotlin中的乘法小数
EN

Stack Overflow用户
提问于 2020-05-18 21:18:49
回答 1查看 4.1K关注 0票数 1

我试图将两种加密货币相乘,例如,0.002000.00300。我把它们定义为浮标,我也尝试过双小数和大小数。但我很难得到我所期望的产出。

下面是一个测试:

代码语言:javascript
复制
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)
    }
}

目前的职能:

代码语言:javascript
复制
fun multiplyDecimal(a: Double, b: Double): BigDecimal {
    return BigDecimal(b).multiply(BigDecimal(a))
}

我对Kotlin/Java并不熟悉,所以我怀疑我可能使用了错误的整数类型。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 21:21:55

BigDecimal的一个关键部分是,您必须在整个过程中使用它:将Double传递到BigDecimal会破坏您从BigDecimal获得的任何好处。

您必须使用StringBigDecimal("0.00200")BigDecimal("0.00400"),并加上引号。然后给他们打电话给multiply。不能对结果调用doubleValue()

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

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

示例代码仅使用BigDecimal,同时避免使用Double。用Java语法。修正了你的输入。

代码语言:javascript
复制
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 ) ) ;

看这个在IdeOne.com现场运行的代码

实际:实际: 0.000008 匹配:真

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61879173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档