32-битный float
может кодировать около 2 32 различных значений точно . Из-за бинарной природы типичного float , 4.2 не является одним из них.
Вместо m
имеет значение 4.1999998...
// closest float
4.19999980926513671875
// hoped for value
4.2
// next closest float
4.200000286102294921875
Мультиплексирование на 100 влечет за собой некоторое округление, и тогда лучший ответ на m*100
будет 419.999969482421875
.
int nm =(m * 100 );
результаты nm == 419
, так как присвоение float
- int
усекает дробную часть.
Рассмотрим округление до ближайшего целого, а не усечение с помощью присваивания int
и использование double
констант.
#include <math.h>
// int nm =(m * 100 );
int nm = lround(m * 100.0);
// or
int nm = round(m * 100.0);