如果我们将整数转换为BigDecimal,Scala似乎会删除所有小数位,只保留1位。
如何让编译保持小数位,而不考虑输入。
scala> val tmp:BigDecimal = 1.00
tmp: BigDecimal = 1.0
// was expecting 1.00
scala> val tmp:BigDecimal = 1.01
tmp: BigDecimal = 1.01
scala> val tmp:BigDecimal = 1.11
tmp: BigDecimal = 1.11编辑1:关于我为什么要保留小数位的一些上下文。我在金融科技的一份工作中工作,在那里小数最多3位是所有数量字段的必修课。前端团队利用scala来显示客户平衡、报告等。
发布于 2020-03-29 18:05:59
我们从ScalaDocs页面了解到:
在大多数情况下,BigDecimal的值也被舍入到MathContext指定的精度。若要创建与其BigDecimal的MathContext不同的精度的
new BigDecimal(new java.math.BigDecimal(...), mc),请使用new BigDecimal(new java.math.BigDecimal(...), mc)。
而且,确实,这似乎是可行的。
import java.math.{BigDecimal=>JBD, MathContext=>JMC}
val a = BigDecimal(2.4) //a: scala.math.BigDecimal = 2.4
a.precision //res0: Int = 2
val b = BigDecimal(new JBD(2.4, new JMC(7))) //b: scala.math.BigDecimal = 2.400000
b.precision //res1: Int = 7但不幸的是,结果并不总是一致的。
import java.math.{BigDecimal=>JBD, MathContext=>JMC}
val a = BigDecimal(2.5) //a: scala.math.BigDecimal = 2.5
a.precision //res0: Int = 2
val b = BigDecimal(new JBD(2.5, new JMC(7))) //b: scala.math.BigDecimal = 2.5
b.precision //res1: Int = 2因此,看起来精度要么是由MathContext设置的,要么是任何足以准确表示所述值的东西,以较小的值为准。(警告:从有限的观察中推测。)
但是,如果您需要的是一致的值表示,那么我建议我们从MathContext转移到StringContext。
val a :BigDecimal = 1
val b :BigDecimal = 2.2
val c :BigDecimal = 3.456
f"$a%.2f" //res0: String = 1.00
f"$b%.2f" //res1: String = 2.20
f"$c%.2f" //res2: String = 3.46 (note the rounding)https://stackoverflow.com/questions/60915535
复制相似问题