浮点型数据编程和数据库的计算误差
C#
//double 是 浮点型数据,其实它并不是保存精确的值,而只是一个近似值,所以才叫做双精度浮点型,不过是精度更高,但不是100%,所以它的有偏差是毫无疑问的,不过值很小而已。。
double d = 0.0;
for (int i=0 ; i < 40; i++)
{
d += 2.2;
Console.WriteLine("Result = {0}",d);
}
Result = 2.2
Result = 4.4
Result = 6.6
Result = 8.8
Result = 11
Result = 13.2
Result = 15.4
Result = 17.6
Result = 19.8
Result = 22
Result = 24.2
Result = 26.4
Result = 28.6
Result = 30.8
Result = 33
Result = 35.2
Result = 37.4
Result = 39.6
Result = 41.8
Result = 44
Result = 46.2
Result = 48.4
Result = 50.6
Result = 52.8
Result = 55
Result = 57.2
Result = 59.4
Result = 61.6
Result = 63.8
Result = 66
Result = 68.2
Result = 70.4
Result = 72.6
Result = 74.8
Result = 77
Result = 79.2
Result = 81.4
Result = 83.6000000000001
Result = 85.8000000000001
Result = 88.0000000000001
对比一下float的精度
float f = 0.0f;
for (int i=0 ; i < 40; i++)
{
f += 2.2f;
Console.WriteLine("Result = {0}",f);
}
Result = 2.2
Result = 4.4
Result = 6.6
Result = 8.8
Result = 11
Result = 13.2
Result = 15.4
Result = 17.6
Result = 19.8
Result = 22
Result = 24.2
Result = 26.4
Result = 28.6
Result = 30.8
Result = 33
Result = 35.2
Result = 37.40001
Result = 39.60001
Result = 41.80001
Result = 44.00001
Result = 46.20001
Result = 48.40001
Result = 50.60001
Result = 52.80001
Result = 55.00001
Result = 57.20001
Result = 59.40001
Result = 61.60001
Result = 63.80001
Result = 66.00002
Result = 68.20001
Result = 70.40001
Result = 72.60001
Result = 74.8
Result = 77
Result = 79.2
Result = 81.39999
Result = 83.59999
Result = 85.79999
Result = 87.99998
_________________________________
*MS-sql*
declare @test float;
declare @at_end int;
SET @test=2.2
set @at_end=0
WHILE @at_end < 41
begin
set @test=@test+2.2
set @at_end=@at_end+1
--print @test
insert into test values(@test);
--commit;
END
select * from test
———————————————————————
4.4
6.6
8.8
11
13.2
15.4
17.6
19.8
22
24.2
26.4
28.6
30.8
33
35.2
37.4
39.6
41.8
44
46.2
48.4
50.6
52.8
55
57.2
59.4
61.6
63.8
66
68.2
70.4
72.6
74.8
77
79.2
81.4
83.6000000000001
85.8000000000001
88.0000000000001
90.2000000000001
92.4000000000001
——————————————————————
*oracle*
declare
test float;
loopint int;
begin
test:=2.2;
loopint :=1;
while loopint < 100 loop
test:=test+2.2;
dbms_output.put_line(test);
loopint := loopint +1;
insert into test_float values(test);
end loop;
commit;
end;
select * from test_float
——————————————————————————————————————————
1 4.4
2 6.6
3 8.8
4 11
5 13.2
6 15.4
7 17.6
8 19.8
9 22
10 24.2
11 26.4
12 28.6
13 30.8
14 33
15 35.2
16 37.4
17 39.6
18 41.8
19 44
20 46.2
21 48.4
22 50.6
23 52.8
24 55
25 57.2
26 59.4
27 61.6
28 63.8
29 66
30 68.2
31 70.4
32 72.6
33 74.8
34 77
35 79.2
36 81.4
37 83.6
38 85.8
39 88
40 90.2
41 92.4
42 94.6
43 96.8
44 99
45 101.2
46 103.4
47 105.6
48 107.8
49 110
50 112.2
51 114.4
52 116.6
53 118.8
54 121
55 123.2
56 125.4
57 127.6
58 129.8
59 132
60 134.2
61 136.4
62 138.6
63 140.8
64 143
65 145.2
66 147.4
67 149.6
68 151.8
69 154
70 156.2
71 158.4
72 160.6
73 162.8
74 165
75 167.2
76 169.4
77 171.6
78 173.8
79 176
80 178.2
81 180.4
82 182.6
83 184.8
84 187
85 189.2
86 191.4
87 193.6
88 195.8
89 198
90 200.2
91 202.4
92 204.6
93 206.8
94 209
95 211.2
96 213.4
97 215.6
98 217.8
99 220


