I understand the principle behind this problem but it’s giving me a headache to think that this is going on throughout my application and I need to find as solution.
double Value = 141.1;
double Discount = 25.0;
double disc = Value * Discount / 100; // disc = 35.275
Value -= disc; // Value = 105.824999999999999
Value = Functions.Round(Value, 2); // Value = 105.82
I’m using doubles to represent quite small numbers. Somehow in the calculation 141.1 – 35.275 the binary representation of the result gives a number which is just 0.0000000000001 out. Unfortunately, since I am then rounding this number, this gives the wrong answer.
I’ve read about using Decimals instead of Doubles but I can’t replace every instance of a Double with a Decimal. Is there some easier way to get around this?
If you’re looking for exact representations of values which are naturally decimal, you will need to replace
doublewithdecimaleverywhere. You’re simply using the wrong datatype. If you’d been usingshorteverywhere for integers and then found out that you needed to cope with larger values than that supports, what would you do? It’s the same deal.However, you should really try to understand what’s going on to start with… why Value doesn’t equal exactly 141.1, for example.
I have two articles on this: