Это не ошибка, она основана на ошибках округления.
Выполнение следующего кода:
val d = 0.08
val f = 0.08F
val fd = f.toDouble()
print("%.20f".format(d) + "\n")
print("%.20f".format(f) + "\n")
print("%.20f".format(fd))
дает следующий вывод:
0.08000000000000000000
0.07999999821186066000
0.07999999821186066000
Итак, как вы можете видеть, двойное значение 0,08 (с точностью до 20-го знака после запятой) точно равно 0,08, в то время как число с плавающей точкой (из-за более низкой точности) не может быть представлено как точное значение, поэтому оно содержит округленное значение, которое немного ниже 0,08.
Преобразование вашего приблизительного (немного меньшего) 0,08 с плавающей запятой в двойное не увеличивает вашу точность, у вас все еще есть ошибка округления с плавающей запятой, в результате чего конвертированный двойник будет немного ниже.
// Редактировать: Если вас интересует, как именно работают числа с плавающей запятой, я бы порекомендовал вам взглянуть на статью википедии об арифметике с плавающей запятой c и на вопрос: Математика с плавающей запятой не работает?