固定小数点数

30分プログラム、その365。Scalaで固定小数を扱うクラスを作ってみた。
固定小数は、1.44を144、0.01を1のように小数点の位置を固定してしまう表現方法。

使い方

scala> val x = new FixNum(144,100)
x: FixNum = 1.44

scala> val y = new FixNum(20,10)
y: FixNum = 2.0

scala> x+y
res0: FixNum = 3.44

scala> x-y
res1: FixNum = -0.56

ソースコード

class FixNum(v : Int, u : Int) {
  val value  = v
  val unit_value = u

  def +(that : FixNum) = lift(_ + _ ,that) 
  def -(that : FixNum) = lift(_ - _ ,that)
  override def toString = (value / (unit_value : Double)).toString

  private def lift(f : (Int,Int) => Int ,that : FixNum) : FixNum = {
    val u = this.unit_value max that.unit_value

    val x = this.value * (u / this.unit_value)
    val y = that.value * (u / that.unit_value)
    new FixNum(f(x,y),u)
  }
}

val x = new FixNum(144,100)
val y = new FixNum(20,10)
println(x + y)
println(x - y)