首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala Double和Precision

Scala Double和Precision
EN

Stack Overflow用户
提问于 2012-06-20 02:14:55
回答 15查看 141.8K关注 0票数 133

有没有可以截断或舍入双精度数的函数?在代码中的某一点上,我希望将类似:1.23456789的数字四舍五入为1.23

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2012-06-20 02:22:28

您可以使用scala.math.BigDecimal

代码语言:javascript
复制
BigDecimal(1.23456789).setScale(2, BigDecimal.RoundingMode.HALF_UP).toDouble

不幸的是,目前(尽管是their Java equivalents are)还没有很好的文档记录,还有许多其他的rounding modes

票数 168
EN

Stack Overflow用户

发布于 2012-06-20 02:56:22

这是另一个不使用BigDecimals的解决方案

截断:

代码语言:javascript
复制
(math floor 1.23456789 * 100) / 100

圆形:

代码语言:javascript
复制
(math rint 1.23456789 * 100) / 100

或者对于任何双精度n和精度p:

代码语言:javascript
复制
def truncateAt(n: Double, p: Int): Double = { val s = math pow (10, p); (math floor n * s) / s }

对于四舍五入函数也可以执行类似的操作,这次使用currying:

代码语言:javascript
复制
def roundAt(p: Int)(n: Double): Double = { val s = math pow (10, p); (math round n * s) / s }

哪一个更可重用,例如,当舍入金额时,可以使用以下内容:

代码语言:javascript
复制
def roundAt2(n: Double) = roundAt(2)(n)
票数 81
EN

Stack Overflow用户

发布于 2013-01-11 04:02:52

由于还没有人提到%运算符,下面就来看一下。它只进行截断,您不能依赖返回值来避免浮点错误,但有时它很方便:

代码语言:javascript
复制
scala> 1.23456789 - (1.23456789 % 0.01)
res4: Double = 1.23
票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11106886

复制
相关文章

相似问题

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