MYSQL数据库 的 decimal 字段类型 和 Java 的BigDecimal


为什么使用decmical

float 和 double都是浮点数,都有取值范围, 都有精度范围。 因此会经常出现下面问题,定义了一个浮点数,经过一系列的计算, 它本来应该等于某个确定值,但实际上并不是。。。???

计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。float  / double相减会转换成二进制,因float有效数字8位, double有效位数为16位,这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有效长度足够长,因此可代替float  / double来进行加减乘除。

金融相关的开发中,金额必须是完全精确的计算,double 和 float 提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了你看到的不正确的结果,故不能使用double或者float,而应该采用java.math.BigDecimal。

decimal

decimal(18,0) 18是定点精度,0是小数位数。

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的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

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

参考https://blog.csdn.net/diyu122222/article/details/76887382

参考 https://blog.csdn.net/u014010512/article/details/91492380




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM