Как получить Scala BigDecimal для отображения большого количества цифр? - PullRequest
3 голосов
/ 22 ноября 2011

делает следующее

  val num = BigDecimal(1.0)
  val den = BigDecimal(3.0)
  println((num/den)(MathContext.DECIMAL128))

Я только получаю

0.3333333333333333333333333333333333

Что меньше, чем 128, я хочу

Ответы [ 3 ]

5 голосов
/ 22 ноября 2011

Контекст по умолчанию - MathContext.DECIMAL128, который используется во всех вычислениях, поэтому в вашем примере результат num / den уже округлен до 128 мест. Вам необходимо сначала установить свой контекст для всех значений, а затем выполнить вычисления.

val mc = new MathContext(512)
val num = BigDecimal(1.0,mc)
val den = BigDecimal(3.0,mc)
println(num/den)

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

2 голосов
/ 22 ноября 2011

MathContext128 - это десятичный формат IEEE 754R, 34 цифры. Таким образом, вывод правильный (я предполагаю, что 128 относится к 128 битам точности, а не к десятичным числам).

Полагаю, вы можете создать свой собственный MathContext примерно в четыре раза с большей точностью:

MathContext moreContext = new MathContext(512); // 512 bits (!) of precision
1 голос
/ 22 ноября 2011

Это работает:

val mc = new java.math.MathContext(128)
val one_third = (BigDecimal(1, mc) / BigDecimal(3, mc)).toString
// 0. and a bunch of 3

one_third.filter(_ == '3').size // returns 128

Если вы используете 512, вы получите 512 '3' цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...