我在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的问题?
谢谢, 戈帕尔。
答案 0 :(得分:1)
当您输入10000000000
时,您尝试定义Int
,与键入1
或-35
时相同。
当您键入sqrt(2)
时,Int
会隐式转换为Double
,因为这是您的函数所期望的,并且这样的隐式转换器确实存在。
但是,当您键入sqrt(10000000000)
时,它会在第一步抛出异常:定义整数10000000000
,这是一个大于Ìnteger.MaxValue`的数字。
重要的是要理解,转换为您想要的类型是在以下之后完成的:
首先为输入定义一个类型(这里没有点或指数的数字被认为是Int
)
然后使用所选类型规则解析输入(这是您的案例中抛出的步骤,因为您的号码无法解析为Int
)