为什么我们需要为Scala中的Double传递指数形式的数字?

时间:2017-03-21 11:19:58

标签: java scala

我在Scala中使用不同的参数执行了以下示例程序。

object TestScalaWS {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet
  3+5                                             //> res0: Int(8) = 8
  1.0E5                                           //> res1: Double(100000.0) = 100000.0
  def abs(x: Double) = if (x<0) - x else x        //> abs: (x: Double)Double

  def sqrtIter(guess: Double, x: Double):Double =
     if (isGoodEnough(guess,x)) guess
     else sqrtIter(improve(guess,x),x)            //> sqrtIter: (guess: Double, x: Double)Double

  def isGoodEnough(guess: Double, x: Double) =
     abs(guess*guess-x) < 0.001                   //> isGoodEnough: (guess: Double, x: Double)Boolean

  def improve(guess: Double, x:Double) =
      (guess + x/guess)/2                         //> improve: (guess: Double, x: Double)Double


  def sqrt(x:Double) = sqrtIter(1.0,x)            //> sqrt: (x: Double)Double
  sqrt(2)                                         //> res2: Double = 1.4142156862745097
  sqrt(4)                                         //> res3: Double = 2.0000000929222947
  sqrt(0.001)                                     //> res4: Double = 0.04124542607499115
  sqrt(0.1e-20)                                   //> res5: Double = 0.03125
  sqrt(0.1e20)                                    //> res6: Double = 3.1622776601683793E9
  sqrt(1.0e20)                                    //> res7: Double = 1.0E10
  sqrt(1E9)                                       //> res8: Double = 31622.776601684047
  sqrt(1000000000)                                //> res9: Double = 31622.776601684047
  sqrt(1E10)                                      //> res10: Double = 100000.0
}

但是sqrt(10000000000)相当于1E10在Scala IDE中给出“整数过大”的错误,即使我已经将x声明为Double。

我假设有一些编译器解释问题,但不知道它究竟意味着什么。这个问题只出现在Scala中吗?或者也存在于Java中。 ?或Scala IDE的问题?

谢谢, 戈帕尔。

1 个答案:

答案 0 :(得分:1)

当您输入10000000000时,您尝试定义Int,与键入1-35时相同。

当您键入sqrt(2)时,Int会隐式转换为Double,因为这是您的函数所期望的,并且这样的隐式转换器确实存在。

但是,当您键入sqrt(10000000000)时,它会在第一步抛出异常:定义整数10000000000,这是一个大于Ìnteger.MaxValue`的数字。

重要的是要理解,转换为您想要的类型是在以下之后完成的:

  • 首先为输入定义一个类型(这里没有点或指数的数字被认为是Int

  • 然后使用所选类型规则解析输入(这是您的案例中抛出的步骤,因为您的号码无法解析为Int