来自: 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;
这个资料你试一下看看?