Question: It's clear that one shouldn't use floating precision when working with, say, monetary amounts since the variation in precision leads to inaccuracies when doing calculations with that amount.

That said, what are use cases when that is acceptable? And, what are the general principles one should have in mind when deciding?

Answer: 
Short story is that if you need **exact** calculations, DO NOT USE floating point.

Don't use floating point numbers as loop indices: Don't get caught doing:

```
for ( d = 0.1; d < 1.0; d+=0.1) 
{  /* Some Code... */ }

```

You will be surprised.

Don't use floating point numbers as keys to any sort of map because you can never count on equality behaving like you may expect.
I think you should ask the other way around: when should you not use floating point. For most numerical tasks, floating point is the preferred data type, as you can (almost) forget about overflow and other kind of problems typically encountered with integer types.

One way to look at floating point data type is that the precision is independent of the dynamic, that is whether the number is very small of very big (within an acceptable range of course), the number of meaningful digits is approximately the same.

One drawback is that floating point numbers have some surprising properties, like x == x can be False (if x is nan), they do not follow most mathematical rules (distributivity, that is x( y + z) != x*y + x*z). Depending on the values for z, y, and z, this can matters.