Точность установлена ​​только на 1 десятичное место только в scala, если все нули в точности - PullRequest
2 голосов
/ 29 марта 2020

Scala, кажется, отбрасывает все десятичные разряды и сохраняет только 1, если мы конвертируем Integer в BigDecimal.

Как я могу сказать компилятору сохранять десятичные разряды независимо от ввода.

    scala> val tmp:BigDecimal = 1.00
    tmp: BigDecimal = 1.0
// was expecting 1.00

    scala> val tmp:BigDecimal = 1.01
    tmp: BigDecimal = 1.01

    scala> val tmp:BigDecimal = 1.11
    tmp: BigDecimal = 1.11

РЕДАКТИРОВАТЬ 1: Некоторый контекст о том, почему я пытаюсь сохранить десятичные разряды. Я работаю на финтех-работе, где десятичные знаки до 3-х знаков обязательны для всех полей суммы. API scala используется командой Front-End для отображения баланса клиентов, сообщает et c.

1 Ответ

1 голос
/ 29 марта 2020

Со страницы ScalaDocs мы узнаем:

В большинстве случаев значение BigDecimal также округляется до точности, указанной в MathContext. Чтобы создать BigDecimal с точностью, отличной от его MathContext, используйте new BigDecimal(new java.math.BigDecimal(...), mc).

И, действительно, это действительно работает.

import java.math.{BigDecimal=>JBD, MathContext=>JMC}

val a = BigDecimal(2.4)                      //a: scala.math.BigDecimal = 2.4
a.precision                                  //res0: Int = 2

val b = BigDecimal(new JBD(2.4, new JMC(7))) //b: scala.math.BigDecimal = 2.400000
b.precision                                  //res1: Int = 7

Но, к сожалению, результаты не всегда согласуются.

import java.math.{BigDecimal=>JBD, MathContext=>JMC}

val a = BigDecimal(2.5)                      //a: scala.math.BigDecimal = 2.5
a.precision                                  //res0: Int = 2

val b = BigDecimal(new JBD(2.5, new JMC(7))) //b: scala.math.BigDecimal = 2.5
b.precision                                  //res1: Int = 2

Таким образом, может показаться, что точность задается либо MathContext, либо этого достаточно для точного представления заданного значения, в зависимости от того, что меньше. (Предупреждение: предположение от ограниченного наблюдения.)

Однако, если вам нужно последовательное представление значения, то я предлагаю перейти от MathContext к StringContext.

val a :BigDecimal = 1
val b :BigDecimal = 2.2
val c :BigDecimal = 3.456

f"$a%.2f"  //res0: String = 1.00
f"$b%.2f"  //res1: String = 2.20
f"$c%.2f"  //res2: String = 3.46 (note the rounding)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...