基於由@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