Python's float makes me want to smoke crack
renesd.blogspot.com
renesd.blogspot.com
Decimal not converting from floats is also intentional. While it's possible to represent any float as a decimal, chances are that any randomly chosen float will be a very long and ugly decimal. Decimal isn't a float replacement - if you're basing your whole argument on the idea that decimal should be the default numeric type, you don't really understand the difference.
All hacking it up with a string does is convince Python that you actually mean that exact number, but you're hacking. Either convert where you got that "float" directly into Decimal (where Python can't tell enough to know where the number came from), or deal with the fact that you are cheating and it may bite you in the future.
So, no, the correct solution is not to "convert the input into a float, then convert that into a string, then convert that to a Decimal"; the correct solution is to make sure you never pass through float in the first place. Unless you're loading a binary file specified as containing IEEE-754 floats, you probably didn't actually have to cut through the float stage. Anything other than the correct solution should be expected to be annoying and blow up at random times.
Floats are treacherous little bastards, and all attempts to paper over that fact will lead to grief.