So I'm trying to figure out why the modulo operator is returning such a large unusual value.
If I have the code:
double result = 1.0d % 0.1d;
it will give a result of 0.09999999999999995
. I would expect a value of 0
Note this problem doesn't exist using the dividing operator -
double result = 1.0d / 0.1d;
will give a result of 10.0
, meaning that the remainder should be 0
.
Let me be clear: I'm not surprised that an error exists, I'm surprised that the error is so darn large compared to the numbers at play. 0.0999 ~= 0.1 and 0.1 is on the same order of magnitude as 0.1d
and only one order of magnitude away from 1.0d
. Its not like you can compare it to a double.epsilon, or say "its equal if its < 0.00001 difference".
I've read up on this topic on StackOverflow, in the following posts one two three, amongst others.
Can anyone suggest explain why this error is so large? Any any suggestions to avoid running into the problems in the future (I know I could use decimal instead but I'm concerned about the performance of that).
Edit: I should specifically point out that I know that 0.1 is an infinitely repeating series of numbers in binary - does that have anything to do with it?