2013-11-23 40 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基本相同)。)

请注意,使用金钱处理时应该注意整数溢出。

相关问题