Scala BigDecimal 在 class 的情况下并强制使用 MathContext
Scala BigDecimal in a case class and forcing a MathContext
我正在尝试创建一个 case class
,其中包含 BigDecimal
作为具有特定 MathContext
的值(RoundUp,Precision 2)。文档说 BigDecimal.mc
是 val
,所以没有简单的重新分配。所以我想出了两个解决方案。第一个
case class Test(number: BigDecimal)
object Test {
def apply(n) = new Test(n, new java.math.MathContext(2))
}
我不喜欢那个,因为它可以用 new
关键字绕行。
case class Test(var number: BigDecimal){
number = BigDecimal(number.toString, new java.math.MathContext(2))
}
第二个有效,但非常丑陋并且会产生额外的开销。我只是想知道我是否忽略了一些简单而优雅的东西。
import scala.languageFeature.implicitConversions
import java.math.{MathContext, BigDecimal}
trait BigDecimalSpecial {
def specialValue: BigDecimal
def mathContext: MathContext
}
object BigDecimalSpecial {
case class BigDecimalSpecial1(bd: BigDecimal) extends BigDecimalSpecial {
val mathContext = new MathContext(2)
val specialValue = new BigDecimal(bd.toString(), mathContext)
}
implicit def toBigDecimalSpecial1(bd: BigDecimal): BigDecimalSpecial = BigDecimalSpecial1(bd)
}
import BigDecimalSpecial._
val b = new BigDecimal("2.353453")
// b: java.math.BigDecimal = 2.353453
val forced = b.specialValue
// forced: java.math.BigDecimal = 2.4
如何将构造函数设为私有,从而强制每个人都使用 apply
?
// constructor is private - use apply instead!
case class MyBigDecimal private(number: BigDecimal)
object MyBigDecimal {
private val defaultContext = new java.math.MathContext(2)
def apply(number: BigDecimal) = new MyBigDecimal(BigDecimal(number.bigDecimal, defaultContext))
}
您的第二个示例也可以重写为丑陋但不那么低效:
case class MyBigDecimalWithVar(var number: BigDecimal) {
number = BigDecimal(number.bigDecimal, new java.math.MathContext(2))
}
我正在尝试创建一个 case class
,其中包含 BigDecimal
作为具有特定 MathContext
的值(RoundUp,Precision 2)。文档说 BigDecimal.mc
是 val
,所以没有简单的重新分配。所以我想出了两个解决方案。第一个
case class Test(number: BigDecimal)
object Test {
def apply(n) = new Test(n, new java.math.MathContext(2))
}
我不喜欢那个,因为它可以用 new
关键字绕行。
case class Test(var number: BigDecimal){
number = BigDecimal(number.toString, new java.math.MathContext(2))
}
第二个有效,但非常丑陋并且会产生额外的开销。我只是想知道我是否忽略了一些简单而优雅的东西。
import scala.languageFeature.implicitConversions
import java.math.{MathContext, BigDecimal}
trait BigDecimalSpecial {
def specialValue: BigDecimal
def mathContext: MathContext
}
object BigDecimalSpecial {
case class BigDecimalSpecial1(bd: BigDecimal) extends BigDecimalSpecial {
val mathContext = new MathContext(2)
val specialValue = new BigDecimal(bd.toString(), mathContext)
}
implicit def toBigDecimalSpecial1(bd: BigDecimal): BigDecimalSpecial = BigDecimalSpecial1(bd)
}
import BigDecimalSpecial._
val b = new BigDecimal("2.353453")
// b: java.math.BigDecimal = 2.353453
val forced = b.specialValue
// forced: java.math.BigDecimal = 2.4
如何将构造函数设为私有,从而强制每个人都使用 apply
?
// constructor is private - use apply instead!
case class MyBigDecimal private(number: BigDecimal)
object MyBigDecimal {
private val defaultContext = new java.math.MathContext(2)
def apply(number: BigDecimal) = new MyBigDecimal(BigDecimal(number.bigDecimal, defaultContext))
}
您的第二个示例也可以重写为丑陋但不那么低效:
case class MyBigDecimalWithVar(var number: BigDecimal) {
number = BigDecimal(number.bigDecimal, new java.math.MathContext(2))
}