@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)
}
}
我々は値でこのメソッドを呼び出すと
scala> solve(0,1,0)
res0: Option[(Double, Double)] = Some((NaN,-Infinity))
私は、なぜ完全にわからないんだけど、私はそれがDouble
の不正確さに関係していると信じて:0
、1
、および0
、私たちは奇妙な何かが起こる気づきます。うまくいけば、他の誰かが、なぜこれが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
何がA'が0であるとき、 '返すようにしようとしていますか? – Brian
@Brian明らかに無限:) – prayagupd
を私は 'NONE'を推測@Brian?私も何を実装しないようにしようとしたので、 – Yawar