Double is not perfectly precise. It is quite literally a function that calculates what the value should be. There are converters to show the drift: https://www.h-schmidt.net/FloatConverter/IEEE754.html
$40.01 is literally stored as 01000010001000000000101000111101 in a float type, which is literally stored as 40.009998321533203125. The margin of error goes up the larger the number.
Either you're just trolling, or incredibly arrogant. I have been coding in the FinTech space for over a decade and can tell you firsthand that these are real issues, and have real consequences.
But hey, don't take my word for it:
- https://dzone.com/articles/never-use-float-and-double-for-monetary-calculatio
- https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types#characteristics-of-the-floating-point-types
- https://swiftbydeya.com/never-use-floating-point-double-data-types-for-monetary-calculations/
- https://www.slingacademy.com/article/handling-currency-and-financial-calculations-with-javascript-numbers/
There have been some famous disasters thanks to floating point math
As for rounding, I can't even think of a way to describe what a terrible idea that is. I'd suggest reading those articles and asking the stock exchange why they don't "just round it" when dealing with millions of transactions that deal with fractions of pennies. "Just round it"