关于Round函数的问题!

muleo 2006-10-18 10:02:13
自己写了一个四舍六入,逢五奇进偶舍的函数。
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)的结果确不同为什么出现这样的情况?错在那里?
...全文
433 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dabaicai 2006-10-19
  • 打赏
  • 举报
回复
改了一下你的函数,实现了你上面说的要求,主要还是浮点型位数的问题
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;
dabaicai 2006-10-18
  • 打赏
  • 举报
回复
逢五奇进偶舍的效果。
这个效果要你自己写代码处理吧
至于上面的
D:= f - 0.0000000000000001;
result := Round(D*m)/m;
已经达到了Round(0.12345*10000)/10000)这个效果吧
muleo 2006-10-18
  • 打赏
  • 举报
回复
to:还是没有达到(Round(0.12345*10000)/10000))四舍六入,逢五奇进偶舍的效果。
dabaicai 2006-10-18
  • 打赏
  • 举报
回复
在有效位数上减个1就可以了,原来好像是说比如double型有效为16位小数的话,就是:
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;
dashi 2006-10-18
  • 打赏
  • 举报
回复
顶~~~
muleo 2006-10-18
  • 打赏
  • 举报
回复
to:dabaicai
直接用Round函数是没有问题的,问题是我自己的那个函数 D:=Round(f*m)/m;没有达到Round(0.12345*10000)/10000)的效果。问题是在这里为什么?
dabaicai 2006-10-18
  • 打赏
  • 举报
回复
你将第二个Round(0.12345*10000)/10000)
中的0.12345作为一个变量就可以了
如:
var ss : double
ss := 0.12345;
round(ss*10000)这样就和第一个一样了,保持类型匹配
muleo 2006-10-18
  • 打赏
  • 举报
回复
To:dabaicai你肯定没有测试过吧!
比如:Round(0.12345*10000)/10000) ->0.1234
Round(0.12355*10000)/10000) ->0.1236
Round(0.123451*10000)/10000)->0.1235
Round函数本身就符合逢五奇进偶舍只不过这个函数用起来不方便想改进一下,没得到想要的结果但是又找不出原因。

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧