• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi数学运算当中四舍五入的问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的。这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 5.5、6.5) 实施Round函数时,处理器根据小数点前数字的奇、偶性来确定舍入与否,如 5.5 Round 结果为 6,而 6.5 Round 结果也为6, 因为 6 是偶数。  对于XXX.5的情况,整数部分是奇数,那么会Round Up,偶数会Round Down,例如:

x:= Round(17.5) = x = 18

x:= Round(12.5) = x = 12

请使用下面的函数代替Round:

function

DoRound(Value: Extended): Int64;

 

procedure Set8087CW(NewCW: Word);

 

asm

 

MOV Default8087CW,AX

FNCLEX

FLDCW Default8087CW

end;

 

const

RoundUpCW

=$1B32;

 

var

OldCW

: Word;

 

begin

OldCW

:= Default8087CW;

 

try

 

Set8087CW

(RoundUpCW);

 

Result

:= Round(Value);

 

finally

 

Set8087CW

(OldCW);

 

end;

 

end

; 对于浮点数,可以用如下函数   function Shisha(x: Double; n: Integer): Double;   begin     x := x*power(10,n-1);     x := Trunc(x + 0.5);     Result := x*power(10,1-n);   end;

 一、四舍五入法     四舍五入是一种应用非常广泛的近似计算方法,其有算术舍入法和银行家舍入法两种。     所谓算术舍入法,就是我们通常意义上的四舍五入法。其规则是:当舍去位的数值大于等于5时,在舍去该位的同时向前位进一;当舍去位的数值小于5时,则直接舍去该位。     所谓银行家舍入法,其实质是一种四舍六入五留双(又称四舍六入五奇偶)法。其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。     综上所述,两种舍入法所得结果不尽一致,因此在使用时必须根据实际需要加以区别。否则会出现一些莫明其妙的偏差。     二、Delphi中的四舍五入函数     众所周知,Delphi中有一个四舍五入取整函数Round。但它是按银行家舍入法的规则实施舍入操作的,Delphi中没有按算术舍入法规则实施舍入操作的四舍五入取整函数。为此,本人编写了一个基于算术舍入法的四舍五入取整函数RoundEx作为对Delphi的补充。具体实现如下:     function RoundEx (const Value: Real): integer;     var       x: Real;     begin       x := Value - Trunc(Value);       if x >= 0.5 then         Result := Trunc(Value) + 1       else Result := Trunc(Value);     end;


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab练习——多项式和一元方程求解发布时间:2022-07-18
下一篇:
让 Source Insight 支持 Delphi (Pascal)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap