浮动步的标量范围精度

KAs*_*KAs 2 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)
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*nov 5

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

BigDecimal("0.05") to BigDecimal("0.95") by BigDecimal("0.05")
Run Code Online (Sandbox Code Playgroud)

它慢很多,所以在某些情况下是不可接受的,但这是在现代计算机上使用小数的现实。