2013-11-23 72 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.所以我扔了math.ceil它,它的工作。但我只是想知道這是否是最好的/適當的/慣用的方法。什麼是Scala中加倍或浮點數的最佳方式?

對於那些誰不知道在那裏這代碼傳來:attendance code

+1

它*取決於所期望的。將float/double轉換爲整型是一個截斷操作。但是,有很多不同的變體,包括實際舍入。另外,請記住FP值可能會出現一些奇怪的邊緣情況。 – user2864740

+0

@ user2864740那麼在這種情況下,我預計150 * .10 == 15.不是14.998。所以我想這是爲了適當的數字。 – dotnetN00b

+0

一些風格問題:你的常量(120,150,5.00)是什麼意思?如果可能的話,我寧願看到指出它們的目的/含義的命名值。另外,爲什麼你從一個方法返回一個匿名函數?這似乎是一個不必要的間接方式,當你可以有一個更簡單的def defance(ticketPrice:Double)= 120 + math.ceil(150 *(5.00 - ticketPrice))toInt'(注意駱駝大小寫和缺少外部大括號) 。 –

回答

6

當錢而工作,你不應該使用float/double類型。我知道這些方法:

  1. 用盡可能小的值,使用整數(即short,int和龍等)(例如美分,satoshis,...)。這可能會通過Scala中的值類來增強。

  2. 使用像BigDecimal這樣的精確運算。

  3. 使用任意精度的定點算術。 (這與a基本相同)。)

請注意,使用金錢處理時應該注意整數溢出。

相關問題