一直以来就为delphi的四舍五入非常苦恼,我一直用下面这个函数
function Round45_EX(GetOldCurr: Double;Digits: integer=2): Double;
var tmpCurr:Double;
begin
  tmpCurr:= GetOldCurr * (IntPower(10,Digits));  // 小数点右移digits位
  if Abs(Frac(tmpCurr)) < 0.5 then
    tmpCurr:= Int(tmpCurr)                // 保留整数部分
  else
  if tmpCurr>0 then
    tmpCurr:= Int(tmpCurr)+1
  else tmpCurr:= Int(tmpCurr)-1;          // 进位
  Result:= tmpCurr /IntPower(10,Digits);  // 小数点回移
end;
但现在发现用round45_ex(3.765)  = 3.77 是对的。
而我用两个double类型的变量比如 一个值为3 一个值为1.255,结果出来的记过就是3.76。
调试的时候发现传入round45_ex的值也是3.765,结果到if Abs(Frac(tmpCurr)) < 0.5 了,结果返回的值就是3.76了?各位有没有遇到类似的情况,如何解决啊

解决方案 »

  1.   

    参看僵哥的代码:
    http://community.csdn.net/Expert/topic/4592/4592417.xml?temp=5.511111E-02
      

  2.   

    没有办法,最后加了个+0.0000000000001后就可以,不知道合不合理。
    function Round45_EX(GetOldCurr: Double;Digits: integer=2): Double;
    var tmpCurr:Double;
    begin
     GetOldCurr:= GetOldCurr+0.0000000000001;
      tmpCurr:= GetOldCurr * (IntPower(10,Digits));  // 小数点右移digits位
      if Abs(Frac(tmpCurr)) < 0.5 then
        tmpCurr:= Int(tmpCurr)                // 保留整数部分
      else
      if tmpCurr>0 then
        tmpCurr:= Int(tmpCurr)+1
      else tmpCurr:= Int(tmpCurr)-1;          // 进位
      Result:= tmpCurr /IntPower(10,Digits);  // 小数点回移
    end;