dephi的bug?四舍五入的问题! (来源于大富翁)

来自: wooder, 时间: 2004-02-07 2:00:00, ID: 2441045 
做个零售系统,打折后一般计算金额到分,但一般都不收分,
因此要把分四舍五入,我想用formatfloat来转换一下.
但这样试,即只要用浮点型变量碰巧取到113.05这样分是5的值,
通formatfloat得到的值总是113.0,即没有四舍五入.但如果不
用变量,直接写formatfloat('0.0',113.05)获得的值又是113.1,
看来是取浮点变量就不行,那位大侠测一下.
procedure TForm1.Button1Click(Sender: TObject);
var Lf_TempSum :real;
begin
  Lf_TempSum := 113.05;
  Edit1.text :=formatfloat('0.0',Lf_TempSum);
end;
不知有没有碰到要四舍五入的问题的,为什么roundto对5
不四舍五入的?比如roundto(12.235,-2),得到的值就是12.23
奇怪.
 
来自: qince, 时间: 2004-02-07 2:05:00, ID: 2441047 
是呀,你再试试:
var Lf_TempSum :real;
begin
  Lf_TempSum := 113.05;
  Edit1.text :=FormatCurr('0.0',Lf_TempSum);
end;
 
来自: qince, 时间: 2004-02-07 2:09:00, ID: 2441048 
BORLAND的ROUND函数只能取整,而且是统计学上的四舍五入(奇数进,偶数不进), [:D]
应用中很不方便,大家提出了很多解决方案,综合起来主要有以下几种:
1.先换算成整数再用round处理,再换算回原来的数据
存在问题:round的取整算法和常用的不一样
2.先换算成整数再+0.5,再用INT处理,再换算回原来的数据
存在问题:很多人编写的函数没有处理负数
3.用FORMATFLOAT函数处理
存在问题:一般的数据均能处理,也是很多人认为的正确的答案,
但如果处理的是运算结果,因运算结果是浮点数,可能存在误差,则结果就不对.
例:显示是1.085,但运算结果可能是1.08499999,则取两位小数的结果为1.08

function RoundFloat(f:double;i:integer):double;
var
s:string;
ef:extended;
begin
s:='#.'+StringOfChar('0',i);
ef:=StrToFloat(FloatToStr(f));//防止浮点运算的误差
result:=StrToFloat(FormatFloat(s,ef));
end;
 
来自: tangle, 时间: 2004-02-07 3:03:00, ID: 2441054 
在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的。这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 5.5、6.5) 实施Round函数时,处理器根据小数点前数字的奇、偶性来确定舍入与否,如 5.5 Round 结果为 6,而 6.5 Round 结果也为6, 因为 6 是偶数。
-以上出自《Essential_Pascal》,希望对你有帮助
 
来自: andy263, 时间: 2004-02-07 10:53:00, ID: 2441372 
统计学上的四舍五入 误差更小!

 
来自: talent002, 时间: 2004-02-07 13:44:00, ID: 2441579 
对delphi 就是用“银行家舍入法”——奇进偶不进,总是返回一个偶数的。如果要解决这个问题的话就自己编个函数来解决吧。
 
来自: qaz2003, 时间: 2004-02-07 14:54:00, ID: 2441671 
终极答案
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1049035

function myround(s:real;non:integer):real;
var
roundi:integer;
j:double;
begin
 j:=s;
 for roundi:=10 downto non do
  begin
   j:=j+1/power(10,roundi+2);
   j:=roundto(j,-roundi);
  end;
 result:=j;
end;  
精确到元:
Function FRound(x:Extended):Int64;
var
Temp:Extended;
begin
Temp:=Frac(x);
if temp>=0.5 then
Result:=Trunc(x)+1
else
Result:=Trunc(x);
end;
 
来自: app2001, 时间: 2004-02-07 15:04:00, ID: 2441694 
Delphi的四舍五入函数Round有BUG,无法正常工作。
对于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;
这个资料你试一下看看?

posted @ 2011-11-07 18:40  覆雨翻云  阅读(1035)  评论(0编辑  收藏  举报