2013-11-23 5 views
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. Так что я бросил на нее математику и это сработало. Но я просто задавался вопросом, является ли это лучшим/правильным/идиоматическим способом сделать это.Каков наилучший способ объединить двойной или плавающий в Scala?

Для тех, кто задается вопросом, где этот код пришел из: attendance code

+1

Это * зависит * от желаемого. Приведение float/double в целочисленный тип является операцией усечения. Тем не менее, существует множество различных вариантов, доступных, включая фактическое округление. Кроме того, имейте в виду, что значения FP могут иметь некоторые нечетные краевые случаи. – user2864740

+0

@ user2864740 Ну в этом случае я ожидал 150 * .10 == 15. Не 14.998. Поэтому я думаю, что это округляет до нужного числа. – dotnetN00b

+0

Несколько вопросов стиля: что означают ваши константы (120, 150, 5,00)? Я бы предпочел увидеть именованные значения, которые указывают, по возможности, их цель/значение. Кроме того, почему вы возвращаете анонимную функцию из метода? Это похоже на ненужный уровень косвенности, когда у вас может быть более простая «посещаемость» (ticketPrice: Double) = 120 + math.ceil (150 * (5,00 - ticketPrice)). ToInt' (отметить случай верблюда и отсутствие посторонних фигурных скобок) , –

ответ

6

При работе с деньгами, вы не должны использовать поплавок/двойных типов. Я знаю, что эти способы:

  1. Используйте целые числа (т.е. Short, Int, длинный и т.д.) с минимально возможными значениями (например, центы, satoshis, ...). Это может быть усилено классами значений в Scala.

  2. Используйте точную арифметику, такую ​​как BigDecimal.

  3. Использование арифметики с фиксированной точкой с произвольной точностью. (Это в основном то же самое с a).)

Обратите внимание, что при работе с деньгами вы должны знать о переполнении целых чисел.

Смежные вопросы