float 步长的标度范围精度

标签 scala

我打算用步长 0.05 生成一个从 0.05 到 0.95 的数组,就像 0.05, 0.1, 0.15, 0.2, ... .但是下面的代码有一些精度问题:

scala> 0.05 to 0.95 by 0.05
res11: scala.collection.immutable.NumericRange[Double] = NumericRange(0.05, 0.1, 0.15000000000000002, 0.2, 0.25, 0.3, 0.35, 0.39999999999999997, 0.44999999999999996, 0.49999999999999994, 0.5499999999999999, 0.6, 0.65, 0.7000000000000001, 0.7500000000000001, 0.8000000000000002, 0.8500000000000002, 0.9000000000000002)

谁能给我一些关于如何解决这个问题的想法?谢谢。

最佳答案

如果您需要精确的十进制计算,实际可靠的方法是使用 BigDecimal :

BigDecimal("0.05") to BigDecimal("0.95") by BigDecimal("0.05")

它要慢得多,因此在某些情况下是 Not Acceptable ,但这就是在现代计算机上使用小数的现实。

关于 float 步长的标度范围精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40607402/

相关文章:

scala - Lisp 宏和 Scala 宏有什么区别?

postgresql - DB 的 Scala future

Scala SBT 无法下载依赖项

scala - 如何在 Linux 上从 Scala 代码运行导出命令来添加新的环境变量?

regex - Scala:在正则表达式模式字符串中连接字符串导致问题

scala - 如何使用 Slick 使用过滤器计算结果?

scala - 在 Scala 中从类型别名创建对象

scala - Docker 构建不使用层缓存

scala - akka http 没有正确处理带有美元符号的参数?

scala - 并发/并行处理的标准做法?