在Scala中采样Double-Ranges的问题

时间:2018-04-16 13:22:41

标签: scala range

我想采样数字范围(提供的开始,结束和增量)。我想知道为什么最后一个元素有时会超过我的上限?

E.g。

(9.474 to 49.474 by 1.0).last>49.474 // gives true

这是因为最后一个元素是49.474000000000004

我知道我也可以使用until来制作一个独占范围,但是我“松散”了1个元素(范围在48.474000000000004处停止。)

有没有办法对开头和结尾“exactely”设置为提供范围的范围进行采样? (背景:上面的解决方案让我在使用apache commons math进行插值时遇到麻烦(不允许外推))

我目前正在采取的措施是四舍五入:

def roundToScale(d:Double,scale:Int) = BigDecimal(d).setScale(scale,BigDecimal.RoundingMode.HALF_EVEN).toDouble

(9.474 to 49.474 by 1.0).map(roundToScale(_:Double,5))

2 个答案:

答案 0 :(得分:3)

这是由于双重算术:9.474 + 1.0 * 40 = 49.474000000000004

您可以从源代码中关注该表达式:https://github.com/scala/scala/blob/v2.12.5/src/library/scala/collection/immutable/NumericRange.scala#L56

如果你想要确切地拥有某些东西,你应该使用Int或Long类型。

答案 1 :(得分:0)

您应该使用BigDecimal

(BigDecimal(9.474) to BigDecimal(49.474) by BigDecimal(1.0))
.map(_.toDouble)