mysql的decimal与Java的BigDecimal用法

mysql的decimal和java中BigDecimal是对应关系

MySQL中 :

精度类型用DECIMAL来保留准确的精度类型, 对于常用的货币数据,钱~

column_name DECIMAL(P, D);

  • P为有效数字的精度,D为小数点后的位数~

  • D不写默认是0,P不写默认是10,那么就成这样了~ column_name DECIMAL;

Java中:

那么在数据库中存完了,接着就是取数据了~

开发中我们如果直接拿过来用的话那绝对就会出错了

System.out.println((1.01 + 2.02) == 3.03 );
System.out.println(new Float(1.01 + 2.02).equals(3.03) );
System.out.println(new Float(1.01 + 2.02) == (3.03) );
System.out.println(new Float(1.01 + 2.02) == new Float(3.03) );

以上结果都是错~, 并不是等于3.03,实际上输出的是3.0300000002,无论是float还是double浮点数,都会失去精度,所以要用到BigDecimal了

创建BigDecimal主要两种方法:

BigDecimal b1 = new BigDecimal("1.34");//1.34  
BigDecimal b2 = BigDecimal.valueOf(1.34);//1.34  

而直接new的话,会丢失精度

BigDecimal one1 = new BigDecimal(1.34);//1.3400000000000000799360577730112709105014801025390625 

除了上述两种,特殊的0, 1, 10可以写成:

BigDecimal zero = BigDecimal.ZERO;  
BigDecimal one = BigDecimal.ONE;  
BigDecimal ten = BigDecimal.TEN;  

比较一下BigDecimal.ZERO、new BigDecimal(“0”)、BigDecimal.valueOf(0)这三者,equals都是true,==的话new BigDecimal(“0”)就不用看了都new了,而BigDecimal.ZERO == BigDecimal.ZERO为true。

查看源码知道:10以内的对象都是同一个。

关于加减乘除

public static double add(double value1,double value2){
       
    BigDecimal b1 = new BigDecimal(Double.toString(value1));  
    BigDecimal b2 = new BigDecimal(Double.toString(value2));  
    return b1.add(b2).doubleValue();  
}  

BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象,这点可能有些小伙伴会搞错要注意一下。

你可能感兴趣的:(mysql,decimal,BigDecimal)