This is almost definitely a problem with mismatched data types.
One thing you'll find out quickly with FP numbers is that they aren't very accurate. The storage technique that holds that number in memory is susceptible to errors, which is why you will get beaten severely by any employer or instructor that catches you using floating point number to calculate money.
So that might be what's going wrong when you add 0.001 to a value. It might not always end up exactly what you expect it to be. There's nothing you can do about that.
Next, when you feed this value to the print routines, function overloading will examine the data type you give it and behave accordingly. This is a C++ thing, and it's really convenient, but it can lead you to the false assumption that it always works like that. It doesn't. So, when you pass a FP number to another function, it may (probably will) get truncated to an integer (goodbye to the decimal point and everything after it) unless the function specifically deals with FP input.
So how to get around this? One, you can work in what's called "fixed point decimal", which basically amounts us to scaling up your unit of measure such that the 1s place in an integer value equates to some other place of significance other than one. One of the most common examples is dealing with money in cents. One dollar would be 100 cents in fixed-point decimal math. Ten dollars would be 1000 cents. So on and so forth. So, to have a number with 3 significant digits beyond the decimal, just multiply all your numbers by 1000 and then just add them together like any other integer. Beware though, you'll be closer to the maximum value that can be held in small integers, so you might want to stick to uint32_t or unsigned long as a data type. (And of course, any function you use has to be built to handle these large types as well. No free lunch.)