我也可以重現此問題。
def roundWithScala(d: Double): Double = {
BigDecimal(d).setScale(3, RoundingMode.HALF_UP).doubleValue()
}
def roundWithJava(d: Double): Double = {
val bd = new java.math.BigDecimal(d).setScale(3, java.math.RoundingMode.HALF_UP)
return bd.doubleValue()
}
println(roundWithScala(8407.3555)) //8407.356
println(roundWithJava(8407.3555)) //8407.355
println(roundWithScala(8409.3555)) //8409.356
println(roundWithJava(8409.3555)) //8409.355
println(roundWithScala(8409.4555)) //8409.456
println(roundWithJava(8409.4555)) //8409.456
我注意到的第一件事是,斯卡拉使用比Java更差MathContext
。
我試過在兩者中都使用相同的MathContext.UNLIMITED
,但它沒有改變任何東西。
然後我注意到,在Scala的BigDecimal
java`s BigDecimal的構造是這樣的:
new BigDecimal(new BigDec(java.lang.Double.toString(d), mc), mc)
我試過在Java中使用它:
val bd = new java.math.BigDecimal(java.lang.Double.toString(d), java.math.MathContext.UNLIMITED).setScale(3, java.math.RoundingMode.HALF_UP)
,我收到相同的結果(8409.356
)。
所以基本上你得到不同的結果的原因是,在scala的構造函數中double被轉換爲字符串。
也許你可以在你的情況下使用java的BigDecimal(就像我在roundWithJava
中做的那樣)?
你如何生成'8409.3555'來傳遞給'round'?兩次在斯卡拉?你有沒有試過從Scala調用Java'round',反之亦然? –
我生成雙「雙d = 8409.3555;」 –