首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果精度为零,则只在scala中将精度设置为小数点1。

如果精度为零,则只在scala中将精度设置为小数点1。
EN

Stack Overflow用户
提问于 2020-03-29 14:19:13
回答 1查看 242关注 0票数 2

如果我们将整数转换为BigDecimal,Scala似乎会删除所有小数位,只保留1位。

如何让编译保持小数位,而不考虑输入。

代码语言:javascript
复制
    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来显示客户平衡、报告等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)

而且,确实,这似乎是可行的。

代码语言:javascript
复制
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

但不幸的是,结果并不总是一致的。

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60915535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档