自己写了一个四舍六入,逢五奇进偶舍的函数。
function f(f:Double;k:Integer):Double;
var
D:Double;
i,m:Integer;
begin
m:=1;
for i:=0 to k-1 do
begin
m:=m*10;
end;
D:=Round(f*m)/m;
Result:=D;
end;
f(0.12345,4)与Round(0.12345*10000)/10000)的结果确不同为什么出现这样的情况?错在那里?
function f(f:Double;k:Integer):Double;
var
D:Double;
i,m:Integer;
begin
m:=1;
for i:=0 to k-1 do
begin
m:=m*10;
end;
D:=Round(f*m)/m;
Result:=D;
end;
f(0.12345,4)与Round(0.12345*10000)/10000)的结果确不同为什么出现这样的情况?错在那里?
中的0.12345作为一个变量就可以了
如:
var ss : double
ss := 0.12345;
round(ss*10000)这样就和第一个一样了,保持类型匹配
直接用Round函数是没有问题的,问题是我自己的那个函数 D:=Round(f*m)/m;没有达到Round(0.12345*10000)/10000)的效果。问题是在这里为什么?
0.12345实际上是0.1234500000000001
把那个0.0000000000000001减掉就可以了,你试试
就是在函数
function f(f:Double;k:Integer):Double;
var
D:Double;
i,m:Integer;
begin
m:=1;
for i:=0 to k-1 do
begin
m:=m*10;
end;
D:=Round(f*m)/m; //这个f先-0.0000000000000001
Result:=D;
end;
这个效果要你自己写代码处理吧
至于上面的
D:= f - 0.0000000000000001;
result := Round(D*m)/m;
已经达到了Round(0.12345*10000)/10000)这个效果吧
比如:Round(0.12345*10000)/10000) ->0.1234
Round(0.12355*10000)/10000) ->0.1236
Round(0.123451*10000)/10000)->0.1235
Round函数本身就符合逢五奇进偶舍只不过这个函数用起来不方便想改进一下,没得到想要的结果但是又找不出原因。
function f(a:Double;k:Integer):Double;
var
D:Double;
i,m:Integer;
begin
m:=1;
for i:=0 to k-1 do
begin
m:=m*10;
end;
D:= a;
Result:=Round(strtofloat(floattostr(d))*m)/m;;
end;