Я пытаюсь построить коллекцию парных разрядов, которая имеет диапазон и шаг. Когда я использую метод Array.iterate
я получаю странные ошибки с плавающей запятой, как, например:Ошибки точности в Scala итерации и диапазон
scala> Array.iterate[Double](0.0, 10)(0.1+)
res0: Array[Double] = Array(0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999)
Это кажется странным, что небольшой диапазон с малым шагом может вызвать такую неточность. Я знаю, что есть другие способы, которыми я мог бы это сделать (например, Array.iterate[Int](0, 10)(1+).map(i => i.toDouble/10.0)
), но я сбиваю с толку, что встроенный метод сбора будет работать так плохо. Есть ли причина для этого или я являюсь толстяком и делаю это неправильно?
как это не ожидаемое поведение? Попробуйте запустить «0.1 + 0.1 + 0.1» в REPL, вы получите '0.30000000000000004' – Tim