当roundto(2.41,-1) =2.4 正确
但roundto(2.45,-1)=2.4为什么?????
怎样解决四舍五入

解决方案 »

  1.   

    var
      s:string;
      begin
         s:=floattostr(2.45);
         roundto(strtofloat(S),-1)
      end;
    这是Delphi 的 Bug
      

  2.   

    这是Delphi 对数字的取舍规定:
    这样更能接近原来的数!建议自己写代码控制吧
      

  3.   


      a:=2.45;
      b:=1e-15;
      if a>0 then
     roundto(a+b,-1)
    else
     roundto(a-b,-1)
      

  4.   

    这不是BUG,这是标准的“银行规则”四舍五入算法,这样在有大量四舍五入的数需要合计的情况下,会使合计值更接近于真实。这个规则的具体算法在于,如果是四或四以下,肯定舍去,如果是五以上,肯定入到上一位,如果正好是5的话,就使结果的最后一位为一个偶数。也就是说,2.45取舍为2.4(4是一个偶数),2.35取舍为2.4(因为4才是偶数而3不是)。举例说明,在银行系统中,如果有两个客户的余额分别为:1.245和1.235,如果不按这个规则,那么四舍五入后(1.25+1.24),结果为2.49,与真实的结果2.48差一分,而按这个规则,四舍五入后(1.24+1.24),正好符合真实的结果2.48。这是为了从概率上来保证合计值的正确性。
      

  5.   

    好像保留到小数点后一位的时候如:roundto(2.45,-1)时为2.5
    小数点后两位就变了。。2.445  为2.44..
    小数点三位:2.4445....2.445
    当后面一位为5时
    小点奇数为变成奇数,偶数位保持偶数。。
      

  6.   

    SeaWave(NoSound) 说的好像很有道理。头一次听说过。
    值得学习了。楼主可以自己定义一点函数,如果函数不好用的情况下。
      

  7.   

    SeaWave(NoSound)说得对,试一就知道了
      

  8.   

    SeaWave(NoSound) 肯定是银行的,哈哈~~~