货币类型精确到角,有以下例子
RoundTo(1.14,-1)=1.1
RoundTo(1.15,-1)=1.1
RoundTo(1.150000001)=1.2
刚开始不知存储精确度的问题,汇总以下发现误差近十元,没办法我改成
RoundTo(x+0.00000001,-1)有没有更好的解决办法,1.5在计算机中是以1.49999xxx9的方式存储的吗

解决方案 »

  1.   

    try: 
    formatFloat('0.00',x);还不行的话自己写一个函数判断好了。
      

  2.   

    这个和数据类型及1.5怎么存储没有关系
    RoundTo()函数采用的是Banker' rounding,可以说是一种取舍规则
    例如:
    5.5 rounds to 6
    6.5 rounds to 6
    要正确的按四舍五入得到6可以将X+0.5
    如果你要精确到两位小数,可以这么写:
    RoundTo((100 * X + 0.5)/100,-2);当然formatfloat()没测试过,应该也可以。
      

  3.   

    var
      S: String;
    begin
      Str(123456.7890:0:2, S);
    这些“伴水”以前提到的,应该有帮助,试试...
      

  4.   

    function round2(v:double):double;//四舍五入函数
    begin
      if rightstr(floattostr(v/100),1)='5' then
        result:=round((v/1000)*10+0.1)/10
      else
        result:=round((v/1000)*10)/10;
    end;
      

  5.   

    在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的。这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 5.5、6.5) 实施Round函数时,处理器根据小数点前数字的奇、偶性来确定舍入与否,如5.5 Round 结果为 6,而 6.5 Round 结果也为6, 因为 6 是偶数。
    round指最近的整数,和银行家舍入法的要求差不多,所以采用了银行家舍入
    这种舍入法可以保证映射的一致性,也说是round(a)=round(a)
    同时保证数值的平均分布。
    银行家舍入法的原理是这样的:
    对于<0.5和>0.5的数都没有异议了
    那么对于0.5而言,就需要变成0或1
    考虑到0.5的发生原理是1 /2
    所以在round之后,应当对同样的操作引入更少的误差
    所以取到偶数,这样的话,在round(round(a / 2) /2 )时,平均误差最小