Java 和 Oracle 四舍五入问题。

Java版本的四舍五入。代码如下:

import java.math.BigDecimal;

public class Tst {
	public static void main(String[] args) {
		for (int i = 1; i < 10000000; i++) {
			if (i % 100 == 49 || i % 100 == 50 || i % 100 == 51) {
				double x = i / 100000d;
				//System.out.print( x +"-ROUND_CEILING:" + new BigDecimal(x).setScale(3, BigDecimal.ROUND_CEILING));
				//System.out.print("-ROUND_DOWN:" + new BigDecimal(x).setScale(3, BigDecimal.ROUND_DOWN));
				//System.out.print("-ROUND_FLOOR:" + new BigDecimal(x).setScale(3, BigDecimal.ROUND_FLOOR));
				//System.out.println(x +"-ROUND_HALF_UP:" + new BigDecimal(x).divide(new BigDecimal(1), 3, BigDecimal.ROUND_HALF_UP));
				//System.out.print("-ROUND_HALF_EVEN:" + new BigDecimal(x).setScale(3, BigDecimal.ROUND_HALF_EVEN));
				//if(new BigDecimal(x).setScale(3, BigDecimal.ROUND_UP).doubleValue()!=round2(x, 3))
				System.out.println(x +"-round2:" + round2(x, 3));
				System.out.println(x +"-round:" + round(x, 3));
				// System.out.print("-ROUND_UNNECESSARY:"+new
				// BigDecimal(x).setScale(3, BigDecimal.ROUND_UNNECESSARY));
				//System.out.println("-ROUND_UP:" + new BigDecimal(x).setScale(3, BigDecimal.ROUND_UP));
				if (i % 100 == 51) {
					System.out.println();
				}
			}
		}
	}
	
	
	public static BigDecimal round(double v,int scale){
		if(scale<0){
			throw new IllegalArgumentException("");
		}
		BigDecimal b =new BigDecimal(Double.valueOf(v));
		BigDecimal one=new BigDecimal("1");
		return b.divide(one,scale,BigDecimal.ROUND_HALF_UP);
	}
	
	public static double round(double v, int scale) {

        if (scale < 0) {

            throw new IllegalArgumentException(

            "The scale must be a positive integer or zero");

        }
        
        if (v == 0) {
            return 0;
        }
        if(Double.isInfinite(v)){
            throw new IllegalArgumentException("计算时异常,四舍五入时,参数是无穷大的情况,无法四舍五入。");
        }
        if(Double.isNaN(v)){
            throw new IllegalArgumentException("计算时异常,四舍五入时,参数是无穷小的情况,无法四舍五入。");
        }
        
        
        BigDecimal b = new BigDecimal(Double.toString(v));

        BigDecimal one = new BigDecimal("1");

        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();


	}
}

简直了。。。试了就知道了。。。。


Oracle 版本的四舍五入:



declare
 v_for number(11,5);
 v_in number(11,5);
 v_out number(11,5);
begin
  v_for:=0.005;
  loop
  
  if v_for>10 then 
    exit;
  end if;
  select round(v_for,2) into v_in from dual;
  select trunc(v_for,2) into v_out from dual;
  --dbms_output.put_line( v_for||'---'|| v_in);
  if v_in = v_out then
    dbms_output.put_line( v_for||'---'|| v_in||'---'||v_out);
  end if;
  
  v_for:=v_for+0.01;
  
  end loop;
    
end;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值