Scala BigДесятичное деление

Какая польза от оператора деления в scala BigDecimal?

val d1 = BigDecimal(2)
val d2 = BigDecimal(3)
val div = d1 / d2 //throws ArithmeticException: non-terminating decimal expansion

Чтобы заставить это работать, вам нужно определить контекст DECIMAL128 для десятичных знаков. К сожалению, единственный способ, которым я могу это сделать, это:

val div = new BigDecimal(d1.bigDecimal.divide(d2.bigDecimal, MathContext.DECIMAL128)) //OK!

Но это просто бардак! Я что-то упускаю?


person oxbow_lakes    schedule 27.08.2009    source источник


Ответы (1)


Это известная ошибка в Scala -> см. тикет №1812. Судя по всему, это исправлено в Scala 2.8. Вы также можете загрузить исправление из отчета об ошибке, которое реализует BigDecimal с прикрепленным к нему MathContext. Используя заданный Decimal.scala, я могу написать что-то вроде это и заставить его работать без ошибок:

val d1 = Decimal128(1)
val d2 = Decimal128(3)
val d3 = d1 / d2 // works, gives a truncated result

Поэтому вы можете либо скомпилировать данный Decimal.scala файл и добавить его в свой classpath, либо дождаться Scala 2.8, в которой он уже есть в стандартной библиотеке.

EDIT См. редакция 18021 стандартной библиотеки Scala. за изменения в BigDecimal, реализующие это.

Надеюсь, поможет :)

-- Flaviu Cipcigan

person Flaviu Cipcigan    schedule 27.08.2009