基于由@WillD提供的答案您的评论,似乎要返回None
发生异常时(大概在计算或者root1
或root2
?)在这种情况下,你可以围绕每一个计算与scala.util.Try,并且每个结果转换为Option
:
import scala.util.Try
def solve(a: Double, b: Double, c: Double): Option[(Double, Double)] = {
val disc = b*b - 4 * a * c
val root1: Option[Double] = Try((-b + disc)/(2*a)).toOption
val root2: Option[Double] = Try((-b - disc)/(2*a)).toOption
// If both `root1` and `root2` are calculated successfully, return the tupled values.
for {
r1 <- root1
r2 <- root2
} yield {
(r1, r2)
}
}
当我们调用此方法与价值0
,1
和0
,我们注意到一些奇怪的事情发生了:
scala> solve(0,1,0)
res0: Option[(Double, Double)] = Some((NaN,-Infinity))
我不完全知道为什么,但我相信它有与Double
不精确做。希望别人能够更好地回答这个问题,为什么这会返回NaN
和-Infinity
。但是,如果我们用BigDecimal
取代的Double
所有出现,我们得到更好的精确度,以及所需的输出:
import scala.util.Try
def solve(a: BigDecimal, b: BigDecimal, c: BigDecimal): Option[(BigDecimal, BigDecimal)] = {
val disc = b*b - 4 * a * c
val root1: Option[BigDecimal] = Try((-b + disc)/(2*a)).toOption
val root2: Option[BigDecimal] = Try((-b - disc)/(2*a)).toOption
// If both `root1` and `root2` are calculated successfully, return the tupled values.
for {
r1 <- root1
r2 <- root2
} yield {
(r1, r2)
}
}
scala> solve(0,1,0)
res1: Option[(BigDecimal, BigDecimal)] = None
什么是你想返回的时候'了'为0? – Brian
@布莱恩显然无限:) – prayagupd
@布莱恩我会猜'没有'? – Yawar