Нет, это не ошибка. Это связано с точностью чисел с плавающей запятой. Как вы, возможно, знаете, компьютер является дискретной машиной. Реальные числа имеют бесконечное число чисел между двумя действиями: компьютер не может обрабатывать числа до бесконечности или даже все числа от 0,00 до 0,01, например: между ними существует бесконечное количество реалов.
Ваш компьютер обрабатывает реляты дискретно: все числа округляются до ближайшего представляемого числа с плавающей запятой; поэтому числа с плавающей запятой всегда содержат ошибку представления (за исключением случаев, когда реальный, который вы ищете, может быть представлен точно). Все небольшие ошибки в расчетах учитывают окончательную ошибку. Это то, что происходит в вашем случае. Для получения дополнительной информации и математического объяснения: https://en.wikipedia.org/wiki/Floating_point
Для примера в реальной жизни. Просто запустите этот фрагмент кода PHP и посмотрите, что произойдет:
$sum = 0.0;
for ($i = 0; $i < 1000; $i++) {
$sum += 0.1;
}
Вы ожидаете, что сумма станет равной 100, не так ли?
Еще один совет о вашей части кода: если вы используете ceil() для получения целого числа, вам лучше использовать функцию round().
См. [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – RiggsFolly
Вы умножаетесь на плавающие номер точки. Почему это приведет к целому числу? –
Можно было бы ожидать целое число, потому что он вызывает ceil, который возвращает целое число. – a2800276