Умножьте BigDecimal на целое число - PullRequest
3 голосов
/ 06 мая 2019

Я хочу умножить финансовую сумму на количество.Я знаю, что Scala использует Java BigDecimal под капотом, но синтаксис, похоже, не тот.

val price = BigDecimal("0.01") // £0.01
val qty   = 10

Я пытался сделать это

BigDecimal(price).*(BigDecimal(qty))

Но это ошибка компиляции.Если я посмотрю на сообщения Java SO, вы можете передать целое число в BigDecimal, а затем умножить его следующим образом:

BigDecimal(price).multiply(BigDecimal(qty))

Так как же это сделать в Scala?И есть ли опасность потери точности при умножении десятичного и целого числа, как это?Мне нужно будет сложить многие из них вместе

Ответы [ 3 ]

3 голосов
/ 06 мая 2019

Вы можете умножить BigDecimal на Int, используя BigDecimal оператор умножения :

def * (что: BigDecimal): BigDecimal

, поскольку Int, который вы предоставите в качестве его параметра, будет неявно преобразован в BigDecimal на основе:

неявный def int2bigDecimal (i: Int): BigDecimal


Таким образом, вы можете безопасно умножить BigDecimal на Int, как если бы это было BigDecimal, и получить BigDecimal без потери точности:

val price = BigDecimal("0.01")
// scala.math.BigDecimal = 0.01
val qty   = 10
// Int = 10
price * qty // same as BigDecimal("0.01").*(10)
// scala.math.BigDecimal = 0.10
1 голос
/ 06 мая 2019

Проблема на самом деле такова:

BigDecimal(price)

price уже BigDecimal, поэтому компилятор не знает, что делать! Если вы исправите это, первая версия работает. Вторая версия терпит неудачу, потому что нет multiply метода на BigDecimal.

Однако, как уже отмечали другие, простое решение - это просто

price*qty
1 голос
/ 06 мая 2019

Вы можете сделать это:

val a = 10
val b = BigDecimal(0.1000000000001)
a * b

res0: scala.math.BigDecimal = 1.0000000000010

Как видите, вы не теряете точность

...