Единственный разумный способ сделать то, что вы хотите, это:
double x = 1.40;
int i;
snprintf(buf, sizeof buf, "%.2f", x);
i = atoi(buf+2);
Это выглядит уродливо и ужасно неэффективно, но проблема с другими подходами состоит в том, что 1.40 не существует в двоичной плавающей запятой. Вместо этого 1.40
соответствует ближайшему существующему значению с плавающей запятой, которое может быть немного меньше или чуть больше 1,40. Если меньше, то такие вещи, как (int)(x*100)
, дадут вам 139 вместо 140.
Использование snprintf
как минимум гарантирует, что при оценке его будет использоваться та же семантика, которая будет использоваться для отображения значения.
Конечно, то, что вы делаете, вероятно, не имеет смысла для начала. Это 1,40 долларов и центов (или аналог в другой валюте)? Если это так, вы должны просто хранить целое число центов для начала. Плавающая точка должна никогда не использоваться для валюты.