bigdecimal.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 267 行

SCALA
267
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2007-2008, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: BigDecimal.scala 14531 2008-04-07 12:15:54Z washburn $package scalaimport java.math.{BigDecimal => BigDec}/**  *  @author  Stephane Micheloud *  @version 1.0 */object BigDecimal {  object RoundingMode extends Enumeration {    type RoundingMode = Value    val ROUND_UP, ROUND_DOWN, ROUND_CEILING, ROUND_FLOOR, ROUND_HALF_UP,        ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_UNNECESSARY = Value  }  private val minCached = -512  private val maxCached = 512  private lazy val cache = new Array[BigDecimal](maxCached - minCached + 1)  /** Constructs a <code>BigDecimal</code> whose value is equal to that of the   *  specified <code>Integer</code> value.   *   *  @param i the specified integer value   *  @return  the constructed <code>BigDecimal</code>   */  def apply(i: Int): BigDecimal =    if (minCached <= i && i <= maxCached) {      val offset = i - minCached      var n = cache(offset)      if (n eq null) { n = new BigDecimal(BigDec.valueOf(i)); cache(offset) = n }      n    } else new BigDecimal(BigDec.valueOf(i))  /** Constructs a <code>BigDecimal</code> whose value is equal to that of the   *  specified long value.   *   *  @param l the specified long value   *  @return  the constructed <code>BigDecimal</code>   */  def apply(l: Long): BigDecimal =    if (minCached <= l && l <= maxCached) apply(l.toInt)    else new BigDecimal(BigDec.valueOf(l))  /** Constructs a <code>BigDecimal</code> whose value is equal to that of the   *  specified double value.   *   *  @param d the specified <code>Double</code> value   *  @return  the constructed <code>BigDecimal</code>   */  def apply(d: Double): BigDecimal =    new BigDecimal(new BigDec(d))  /** Translates a character array representation of a <code>BigDecimal</code>   *  into a <code>BigDecimal</code>.   */  def apply(x: Array[Char]): BigDecimal =     new BigDecimal(new BigDec(x.toString))  /** Translates the decimal String representation of a <code>BigDecimal</code>   *  into a <code>BigDecimal</code>.   */  def apply(x: String): BigDecimal =     new BigDecimal(new BigDec(x))  /** Constructs a <code>BigDecimal</code> whose value is equal to that of the   *  specified <code>BigInt</code> value.   *   *  @param x the specified <code>BigInt</code> value   *  @return  the constructed <code>BigDecimal</code>   */  def apply(x: BigInt): BigDecimal =    new BigDecimal(new BigDec(x.bigInteger))  /** Implicit conversion from <code>Int</code> to <code>BigDecimal</code>. */  implicit def int2bigDecimal(i: Int): BigDecimal = apply(i)  /** Implicit copnversion from <code>Long</code> to <code>BigDecimal</code>. */  implicit def long2bigDecimal(l: Long): BigDecimal = apply(l)  /** Implicit copnversion from <code>Double</code> to <code>BigDecimal</code>. */  implicit def double2bigDecimal(d: Double): BigDecimal = apply(d)  /** Implicit conversion from BigDecimal to <code>Ordered</code>. */  implicit def bigDecimal2ordered(x: BigDecimal): Ordered[BigDecimal] =    new Ordered[BigDecimal] with Proxy {      def self: Any = x      def compare(y: BigDecimal): Int = x.bigDecimal.compareTo(y.bigDecimal)    }}/**  *  @author  Stephane Micheloud *  @version 1.0 */@serializableclass BigDecimal(val bigDecimal: BigDec) extends java.lang.Number {  import BigDecimal.RoundingMode._  /** Returns the hash code for this BigDecimal. */  override def hashCode(): Int = this.bigDecimal.hashCode()  /** Compares this BigDecimal with the specified value for equality.   */  override def equals (that: Any): Boolean = that match {    case that: BigDecimal => this equals that    case that: java.lang.Double => this.bigDecimal.doubleValue == that.doubleValue    case that: java.lang.Float  => this.bigDecimal.floatValue == that.floatValue    case that: java.lang.Number => this equals BigDecimal(that.longValue)    case that: java.lang.Character => this equals BigDecimal(that.charValue.asInstanceOf[Int])    case _ => false  }  /** Compares this BigDecimal with the specified BigDecimal for equality.   */  def equals (that: BigDecimal): Boolean =    this.bigDecimal.compareTo(that.bigDecimal) == 0  /** Compares this BigDecimal with the specified BigDecimal   */  def compare (that: BigDecimal): Int = this.bigDecimal.compareTo(that.bigDecimal)  /** Less-than-or-equals comparison of BigDecimals   */  def <= (that: BigDecimal): Boolean = this.bigDecimal.compareTo(that.bigDecimal) <= 0  /** Greater-than-or-equals comparison of BigDecimals   */  def >= (that: BigDecimal): Boolean = this.bigDecimal.compareTo(that.bigDecimal) >= 0  /** Less-than of BigDecimals   */  def <  (that: BigDecimal): Boolean = this.bigDecimal.compareTo(that.bigDecimal) <  0  /** Greater-than comparison of BigDecimals   */  def >  (that: BigDecimal): Boolean = this.bigDecimal.compareTo(that.bigDecimal) > 0  /** Addition of BigDecimals   */  def +  (that: BigDecimal): BigDecimal =    new BigDecimal(this.bigDecimal.add(that.bigDecimal))  /** Subtraction of BigDecimals   */  def -  (that: BigDecimal): BigDecimal =    new BigDecimal(this.bigDecimal.subtract(that.bigDecimal))  /** Multiplication of BigDecimals   */  def *  (that: BigDecimal): BigDecimal =    new BigDecimal(this.bigDecimal.multiply(that.bigDecimal))  /** Division of BigDecimals   */  def /  (that: BigDecimal): BigDecimal =   new BigDecimal(this.bigDecimal.divide(that.bigDecimal, this.scale - that.scale))  /** Returns the minimum of this and that   */  def min (that: BigDecimal): BigDecimal =    new BigDecimal(this.bigDecimal.min(that.bigDecimal))  /** Returns the maximum of this and that   */  def max (that: BigDecimal): BigDecimal =    new BigDecimal(this.bigDecimal.max(that.bigDecimal))  /** Returns a BigDecimal whose value is the negation of this BigDecimal   */  def unary_- : BigDecimal = new BigDecimal(this.bigDecimal.negate())    /** Returns the absolute value of this BigDecimal   */  def abs: BigDecimal = new BigDecimal(this.bigDecimal.abs())  /** Returns the sign of this BigDecimal, i.e.    *   -1 if it is less than 0,    *   +1 if it is greater than 0   *   0  if it is equal to 0   */  def signum: Int = this.bigDecimal.signum()  /** Returns the scale of this <code>BigDecimal</code>.   */  def scale: Int = this.bigDecimal.scale()  /** Returns a <code>BigDecimal</code> whose scale is the specified value, and whose value is   *  numerically equal to this BigDecimal's.   */  def setScale(scale: Int): BigDecimal =    new BigDecimal(this.bigDecimal setScale scale)  def setScale(scale: Int, mode: RoundingMode): BigDecimal =    new BigDecimal(this.bigDecimal.setScale(scale, mode.id))  /** Converts this BigDecimal to a <tt>byte</tt>.    *  If the BigDecimal is too big to fit in a byte, only the low-order 8 bits are returned.    *  Note that this conversion can lose information about the overall magnitude of the    *  BigDecimal value as well as return a result with the opposite sign.   */  override def byteValue   = intValue.toByte  /** Converts this BigDecimal to a <tt>short</tt>.    *  If the BigDecimal is too big to fit in a byte, only the low-order 16 bits are returned.    *  Note that this conversion can lose information about the overall magnitude of the    *  BigDecimal value as well as return a result with the opposite sign.   */  override def shortValue  = intValue.toShort  /** Converts this BigDecimal to a <tt>char</tt>.    *  If the BigDecimal is too big to fit in a char, only the low-order 16 bits are returned.    *  Note that this conversion can lose information about the overall magnitude of the    *  BigDecimal value and that it always returns a positive result.   */  def charValue   = intValue.toChar  /** Converts this BigDecimal to an <tt>int</tt>.    *  If the BigDecimal is too big to fit in a char, only the low-order 32 bits   *  are returned. Note that this conversion can lose information about the   *  overall magnitude of the BigDecimal value as well as return a result with   *  the opposite sign.   */  def intValue    = this.bigDecimal.intValue  /** Converts this BigDecimal to a <tt>Long</tt>.   *  If the BigDecimal is too big to fit in a char, only the low-order 64 bits   *  are returned. Note that this conversion can lose information about the   *  overall magnitude of the BigDecimal value as well as return a result with   *  the opposite sign.   */  def longValue   = this.bigDecimal.longValue  /** Converts this BigDecimal to a <tt>float</tt>.   *  if this BigDecimal has too great a magnitude to represent as a float,   *  it will be converted to <code>Float.NEGATIVE_INFINITY</code> or   *  <code>Float.POSITIVE_INFINITY</code> as appropriate.   */  def floatValue  = this.bigDecimal.floatValue  /** Converts this BigDecimal to a <tt>Double</tt>.    *  if this BigDecimal has too great a magnitude to represent as a float,    *  it will be converted to <code>Float.NEGATIVE_INFINITY</code> or   *  <code>Float.POSITIVE_INFINITY</code> as appropriate.    */  def doubleValue = this.bigDecimal.doubleValue  /** Converts this <code>BigDecimal</code> to a BigInteger.   */  def toBigInt(): BigInt = new BigInt(this.bigDecimal.toBigInteger())  /** Returns the decimal String representation of this BigDecimal.   */  override def toString(): String = this.bigDecimal.toString()}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?