Со страницы 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)