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