示例1

mysql bigint java id类型 mysql decimal对应java_数位


问, 结果是多少? 0.01?

No! 结果是0.009999999999999998!

为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是! 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.

mysql中的decimal , 在java中的用BigDecimal表示的。

decimal

  • decimal(18,2) 18是定点精度2是小数位数
  • 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!
  • decimal(a,b)
  • a指定小数点左边和右边可以存储的十进制数字的最大个数最大精度38
  • b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0

BigDecimal

  • Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
  • 双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。

BigDecimal的四则运算

BigDecimal a = new BigDecimal("123");
BigDecimal b = new BigDecimal("456");

BigDecimal c = a.add(b);// 加
BigDecimal d = a.subtract(b);// 减
BigDecimal e = a.multiply(b);// 乘

// 除
// 参数2:指定精度,保留6位小数 ; 参数3: 选择舍入模式,此处为 四舍五入
BigDecimal f = a.divide(b, 6, BigDecimal.ROUND_HALF_UP);

// jdk 1.9中第三个参数 被RoundingMode取代
BigDecimal f = a.divide(b,RoundingMode.DOWN);//舍弃小数位
BigDecimal f = a.divide(b,2,RoundingMode.HALF_DOWN );//2位小数;舍入模式为大于0.5进1,否则舍弃。

注: BigDecimal的除法,需要指定计算答案的精度, 不然计算机不知道你的精度为多少,会抛异常的。Exception in thread “main” java.lang.ArithmeticException

BigDecimal 的 signum() 方法 : 返回此 BigDecimal 的正负号

//返回 1 表示值 为正值 ;  0 表示 为 0 ;  -1 表示 负数 。
BigDecimal a = new BigDecimal("123");
int b = a.signum(); // 结果是 1

BigDecimal 的 compareTo()方法 , 比较大小 ; (不能直接使用算数运算符 == ,>, < 比较)

// 结果 : 1 表示 大于; 0 表示 等于; -1 表示 小于 .
BigDecimal a = new BigDecimal(0.5);
BigDecimal b = new BigDecimal(0.2);
int c = a.compareTo(b); // 结果 C = 1