一.Java
1.float型定义的数据末尾必须 有"f "或"F",为了和double区别。例float x=123.456f, y=2e20f;
public static void main(String[] args) { System.out.println(0.08f + 0.01f); }
输出:
0.089999996
2.精确计算中我们要用java.math.BigDecimal
class DecimalUtil{ private static final int DEF_DIV_SCALE=10; public static double add(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.add(b2).doubleValue(); } public static double sub(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.subtract(b2).doubleValue(); } public static double mul(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.multiply(b2).doubleValue(); } public static double div(double d1,double d2){ return div(d1,d2,DEF_DIV_SCALE); } public static double div(double d1,double d2,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } }
二。Mysql
1.float
create table t_float(c1 float(10,2), c3 decimal(10,2)); insert into t_float values(9876543.21, 9876543.12); select * from t_float;
输出:
9876543.00 | 9876543.12
2.decimal
create table t_decimal(d1 decimal(5,3)); insert into t_decimal(d1) values (1.2345),(12.345),(123.45),(1.2); select * from t_decimal;
输出:
+--------+ | num | +--------+ | 1.235 | | 12.345 | | 99.999 | | 1.200 | +--------+
分析:
1.2345 -- 小数点后最多3位,所以保存可以,自动四舍五入数据截断。 12.345 -- OK 123.45 -- 因为小数部分未满3位,要补0。所以保存应该123.450。但整个位数超出了5,因此保存不了 1.2 -- 小数未满部分补0