dot*_*00b 2 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)
Run Code Online (Sandbox Code Playgroud)
基本上断言正在爆炸,出席人数正在返回134而不是135.所以我把math.ceil扔到它并且它起作用了.但我只是想知道这是否是最佳/适当/惯用的方式.
对于那些想知道这些代码来自何处的人:出勤代码
使用money时,不应使用float/double类型.我知道这些方法:
使用具有最小可能值的整数(即Short,Int,Long等)(例如,分,satoshis,......).Scala中的值类可能会增强这一点.
使用像BigDecimal这样的精确算术.
使用任意精度的定点算术.(这与a基本相同.)
请注意,使用钱时应注意整数溢出.