我也可以重现此问题。
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;” –