Плавающая точка всегда немного неточна.При кодировании с плавающей запятой IEEE степени двух могут быть представлены точно (например, 4,2,1,0.5,0.25,0.125,0.0625, ...), но числа, подобные 0,1, всегда являются приблизительными (просто попробуйте представить их как суммустепеней 2).
Ваш (int) состав будет усекать все, что приходит, поэтому, если p * 100 разрешается до 117,99999995 из-за этой неточности, оно становится 1,17 вместо 1,18.
* 1004Лучшее решение - использовать что-то вроде roundf на p * 100.Еще лучше было бы, если бы вы могли идти вверх по течению и полностью преобразовать математику с фиксированной запятой, используя целые числа во всей программе.