Всем привет!
Вот запустил такой код:
Пример
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public class Main {
public static void main(String[] args) {
method1(100);
method2(100);
System.exit(1);
}
public static void method1(int steps) {
float f1 = 0.2f, f2 = 0.3f;
for (int i = 0; i < steps; i++) {
System.out.println(f1 + f2 * i);
}
}
public static void method2(int steps) {
float f = 0.2f;
double d = 0.2d;
for (int i = 0; i < steps; i++) {
double di = d * i;
float fi = f * i;
System.out.println((di == fi) + " f = " + fi + " d = " + di);
}
}
}
И получил такой вот результат:
Результат
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
0.2
0.5
0.8
1.1
1.4000001
1.7
2.0
2.3000002
2.6000001
2.9
3.2
3.5000002
3.8000002
4.1
4.4
4.7
5.0
5.3
5.6
5.9
6.2
6.5
6.8
7.1
7.4
7.7000003
8.0
8.3
8.6
8.900001
9.2
9.5
9.8
10.1
10.400001
10.7
11.0
11.3
11.6
11.900001
12.2
12.5
12.8
13.1
13.400001
13.700001
14.0
14.3
14.6
14.900001
15.200001
15.5
15.8
16.1
16.400002
16.7
17.000002
17.300001
17.600002
17.900002
18.2
18.500002
18.800001
19.100002
19.400002
19.7
20.000002
20.300001
20.600002
20.900002
21.2
21.500002
21.800001
22.100002
22.400002
22.7
23.000002
23.300001
23.600002
23.900002
24.2
24.500002
24.800001
25.100002
25.400002
25.700003
26.000002
26.300001
26.600002
26.900002
27.200003
27.500002
27.800001
28.100002
28.400002
28.700003
29.000002
29.300001
29.600002
29.900002
true f = 0.0 d = 0.0
false f = 0.2 d = 0.2
false f = 0.4 d = 0.4
false f = 0.6 d = 0.6000000000000001
false f = 0.8 d = 0.8
true f = 1.0 d = 1.0
false f = 1.2 d = 1.2000000000000002
false f = 1.4 d = 1.4000000000000001
false f = 1.6 d = 1.6
false f = 1.8000001 d = 1.8
true f = 2.0 d = 2.0
false f = 2.2 d = 2.2
false f = 2.4 d = 2.4000000000000004
false f = 2.6000001 d = 2.6
false f = 2.8 d = 2.8000000000000003
true f = 3.0 d = 3.0
false f = 3.2 d = 3.2
false f = 3.4 d = 3.4000000000000004
false f = 3.6000001 d = 3.6
false f = 3.8 d = 3.8000000000000003
true f = 4.0 d = 4.0
false f = 4.2000003 d = 4.2
false f = 4.4 d = 4.4
false f = 4.6 d = 4.6000000000000005
false f = 4.8 d = 4.800000000000001
true f = 5.0 d = 5.0
false f = 5.2000003 d = 5.2
false f = 5.4 d = 5.4
false f = 5.6 d = 5.6000000000000005
false f = 5.8 d = 5.800000000000001
true f = 6.0 d = 6.0
false f = 6.2000003 d = 6.2
false f = 6.4 d = 6.4
false f = 6.6 d = 6.6000000000000005
false f = 6.8 d = 6.800000000000001
true f = 7.0 d = 7.0
false f = 7.2000003 d = 7.2
false f = 7.4 d = 7.4
false f = 7.6 d = 7.6000000000000005
false f = 7.8 d = 7.800000000000001
true f = 8.0 d = 8.0
false f = 8.2 d = 8.200000000000001
false f = 8.400001 d = 8.4
false f = 8.6 d = 8.6
false f = 8.8 d = 8.8
true f = 9.0 d = 9.0
false f = 9.2 d = 9.200000000000001
false f = 9.400001 d = 9.4
false f = 9.6 d = 9.600000000000001
false f = 9.8 d = 9.8
true f = 10.0 d = 10.0
false f = 10.2 d = 10.200000000000001
false f = 10.400001 d = 10.4
false f = 10.6 d = 10.600000000000001
false f = 10.8 d = 10.8
true f = 11.0 d = 11.0
false f = 11.2 d = 11.200000000000001
false f = 11.400001 d = 11.4
false f = 11.6 d = 11.600000000000001
false f = 11.8 d = 11.8
true f = 12.0 d = 12.0
false f = 12.2 d = 12.200000000000001
false f = 12.400001 d = 12.4
false f = 12.6 d = 12.600000000000001
false f = 12.8 d = 12.8
true f = 13.0 d = 13.0
false f = 13.2 d = 13.200000000000001
false f = 13.400001 d = 13.4
false f = 13.6 d = 13.600000000000001
false f = 13.8 d = 13.8
true f = 14.0 d = 14.0
false f = 14.2 d = 14.200000000000001
false f = 14.400001 d = 14.4
false f = 14.6 d = 14.600000000000001
false f = 14.8 d = 14.8
true f = 15.0 d = 15.0
false f = 15.2 d = 15.200000000000001
false f = 15.400001 d = 15.4
false f = 15.6 d = 15.600000000000001
false f = 15.8 d = 15.8
true f = 16.0 d = 16.0
false f = 16.2 d = 16.2
false f = 16.4 d = 16.400000000000002
false f = 16.6 d = 16.6
false f = 16.800001 d = 16.8
true f = 17.0 d = 17.0
false f = 17.2 d = 17.2
false f = 17.4 d = 17.400000000000002
false f = 17.6 d = 17.6
false f = 17.800001 d = 17.8
true f = 18.0 d = 18.0
false f = 18.2 d = 18.2
false f = 18.4 d = 18.400000000000002
false f = 18.6 d = 18.6
false f = 18.800001 d = 18.8
true f = 19.0 d = 19.0
false f = 19.2 d = 19.200000000000003
false f = 19.4 d = 19.400000000000002
false f = 19.6 d = 19.6
false f = 19.800001 d = 19.8
Откуда берутся маленькие дробные части чисел, я понимаю, это из-за их представления в машинной памяти.
Но меня интересует другой вопрос, почему к примеру результат выполнения
method1() НЕ ВСЕГДА показывает эти маленькие остатки, а только в некоторых случаях. Почему, к примеру, во второй строке сразу не показало
0.5000001 :
1.
2.
3.
4.
5.
6.
0.2
0.5
0.8
1.1
1.4000001
1.7