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

  • 相关阅读:
    linux安装navicat全程记录
    MySQL5.7.20报错Access denied for user 'root'@'localhost' (using password: NO)
    java中的异步处理和Feature接口(一)
    @Autowired注解与@Resource注解的区别与用法
    超详细MySQL安装及基本使用教程
    linux下mysql开启远程访问权限及防火墙开放3306端口
    mysql之my.cnf详解
    centos7 mysql 启动mysqld.service
    linux系统安装mysql数据库
    ExecutorService 的理解与使用
  • 原文地址:https://www.cnblogs.com/railgunman/p/2239640.html
Copyright © 2020-2023  润新知