限制Scala中的小数位数

时间:2018-07-11 22:51:34

标签: scala

我是Scala的新手,我试图编写一个函数,该函数接受一个double和一个整数作为输入,并以小数点后的精度返回double值。

tall_unanswered <- foobar %>% select(ends_with("unanswered"), month) %>% 
  gather(key = tag, value = count, -month)
tall_total <- foobar %>% select(-ends_with("unanswered")) %>% 
  gather(key = tag, value = count, -month)
p <- ggplot(tall_total, aes(x = month, y = count, color = tag)) +
  geom_line() +
  geom_line(data = tall_unanswered, linetype = "dashed")

我的输入是1.140060000,我期望输出是1.14006,但是返回1.140060000。 5个精度点后不考虑0。

3 个答案:

答案 0 :(得分:0)

双打不存储精度;它们都具有完全相同的精度。而且它们也是二进制的,因此它们可能与它们来自的BigDecimal不完全匹配。如果您需要保留该精度信息,建议您将其保留为BigDecimal,甚至将其转换为String

答案 1 :(得分:0)

首先,当我在repl中编译您的代码段时,会引发编译错误。

BigDecimal.(d)->语法错误。应该是BigDecimal(d)

在我编译并运行代码后对其进行更正后,它会提供正确的输出。

 scala> def decimal_value(d: Double, p: Integer) : 
     |   Double = {
     |    if (d >= 0) {
     |      BigDecimal(d).setScale(p, BigDecimal.RoundingMode.HALF_UP).toDouble
     |    }
     |    else
     |      d
     | }
decimal_value: (d: Double, p: Integer)Double

scala> decimal_value(1.140060000, 5)
res4: Double = 1.14006

答案 2 :(得分:0)

1.1400600001.14006是相同的数字,因此看起来这个问题是关于在打印出值时显示值的方式。在此toString上调用Double会得到“ 1.14006”,这正是您想要的,因此不清楚为什么会得到“ 1.140060000”

您可以使用字符串格式化操作来确保获得所需的特定输出:

val str = f"$d7.1f"