在Scala中舍入double或float的最佳方法是什么?

时间:2013-11-23 19:52:13

标签: scala rounding-error

  // Purpose: Determine attendance based on ticket-price
  // Example: attendance(4.90) == 135
  def attendance: Double => Int = {
    (ticket_price: Double) => {
        120 + math.ceil(150 * (5.00 - ticket_price)).toInt
    }
  }                                               //> attendance: => Double => Int
  attendance(4.90)                                //> res0: Int = 135
  assert(attendance(4.90) == 135)

基本上断言正在爆发,出席人数正在返回134而不是135.所以我把math.ceil扔到了它并且它起作用了。但我只是想知道这是否是最佳/适当/惯用的方式。

对于那些想知道此代码来自何处的人:attendance code

1 个答案:

答案 0 :(得分:6)

使用money时,不应使用float / double类型。我知道这些方法:

  1. 使用具有最小可能值的整数(即Short,Int,Long等)(例如,分数,satoshis,......)。 Scala中的值类可能会增强这一点。

  2. 使用像BigDecimal这样的精确算术。

  3. 使用任意精度的定点算术。 (这与a基本相同。)

  4. 请注意,使用资金时应注意整数溢出。