> Why the integer printing doesn't work? And why the float one does?
Let's look at this first.

> int a = 2 MY_PART;
The calculation is done as a floating point calculation, but the assignment forces the result back to an integer.

> printf("%d\n", a MY_PART); // prints 0 (?)
> printf("%f\n", a MY_PART); // prints 6
It's still a floating point calculation, but there is no assignment to force truncation back to integer.
The %d will just see a bunch of bits of a floating point (actually double), do it's best to interpret those as an integer and fail (giving you zero).