2
  // 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 扔给它,它起作用了。但我只是想知道这是否是最好的/正确的/惯用的方法。

对于那些想知道此代码来自哪里的人:出勤代码

4

1 回答 1

6

使用金钱时,不应使用浮点/双精度类型。我知道这些方法:

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

  2. 使用 BigDecimal 等精确算术。

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

请注意,在使用货币时,您应该注意整数溢出。

于 2013-11-24T09:19:20.920 回答