// 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. Так что я бросил на нее математику и это сработало. Но я просто задавался вопросом, является ли это лучшим/правильным/идиоматическим способом сделать это.Каков наилучший способ объединить двойной или плавающий в Scala?
Для тех, кто задается вопросом, где этот код пришел из: attendance code
Это * зависит * от желаемого. Приведение float/double в целочисленный тип является операцией усечения. Тем не менее, существует множество различных вариантов, доступных, включая фактическое округление. Кроме того, имейте в виду, что значения FP могут иметь некоторые нечетные краевые случаи. – user2864740
@ user2864740 Ну в этом случае я ожидал 150 * .10 == 15. Не 14.998. Поэтому я думаю, что это округляет до нужного числа. – dotnetN00b
Несколько вопросов стиля: что означают ваши константы (120, 150, 5,00)? Я бы предпочел увидеть именованные значения, которые указывают, по возможности, их цель/значение. Кроме того, почему вы возвращаете анонимную функцию из метода? Это похоже на ненужный уровень косвенности, когда у вас может быть более простая «посещаемость» (ticketPrice: Double) = 120 + math.ceil (150 * (5,00 - ticketPrice)). ToInt' (отметить случай верблюда и отсутствие посторонних фигурных скобок) , –