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;