一.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