I recently wrote a simple loop, and I got unexpected behavior:
for(double x = 0.0; x <= 1.0; x += 0.05) { Console.WriteLine(x.ToString()); }
This is the conclusion:
0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95
Note that 1 does not appear, although the condition for continuing the for loop seems to include it. I understand that the reason for this is that decimal numbers are stored in binary memory, that is, 1 is actually not exactly 1, but actually 1.0000000000000002 (according to the watch variable in Visual Studio). So my question is: what is the best way to avoid this unexpected behavior? One way is to use the decimal type instead of double , but most of the functions of System.Math only work with double , and casting between them is not easy.
source share