用 Currecy 类型就很好,专门为金融设计的类型。

解决方案 »

  1.   

    厄……,我们的数据是需要保留4位小数,从第五位开始使用银行家舍入进行精确,但是Currency类型本身就只保留4位小数,也就是说没等我们舍入,他自己就已经帮我们进行取舍了,所以没法用。
    不过还是谢谢你,我也是试过之后才知道的。
      

  2.   

    是指“ (x+0.5)/1”吗?还是Round方法?(x+0.5)/1的话,因为四舍五入相对简单,只需要和5比较就好了,但是银行家舍入比较麻烦,需要跟4,5,6比较,如果是5的话,还得看5后面是否为0,要是为0还得看5前面是奇数还是偶数,需要比较的阈值比较多。
      

  3.   

    写了个C++版本,欢迎指正:
    double CUtilities::RoundOffBank(double& x,int32_t n)
    {
        n = n + 1;
    double temp = x * pow(10, n);
        int32_t iNum2 = floor(temp);
        int32_t iNum1 = iNum2  %  10 ;
        if (iNum1 < 5)
        {
            x = ((iNum2 - iNum1) * pow(10, -n));
        }
        else if (iNum1 > 5)
        {
            x = ((iNum2 + 10 - iNum1) * pow(10, -n));
        } 
        else // iNum1 == 5
        {
            double after5 = temp - iNum2;
            if (after5 > 0)
            {
                x = ((iNum2 + 10 - iNum1) * pow(10, -n));
            }
            else //after5 == 0
            {
                int32_t before5 = ( (iNum2 - iNum1) / 10 ) % 2;
                if(before5 == 1)
                    x = ((iNum2 + 10 - iNum1) * pow(10, -n));
                else
                    x = ((iNum2 - iNum1) * pow(10, -n));
            }
        }
        return x;
    }