欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解MySQL的decimal字段类型与Java的BigDecimal的关系

最编程 2024-01-31 15:53:17
...

为什么使用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.****.net/diyu122222/article/details/76887382

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



原文地址:https://www.cnblogs.com/HKnight/p/12923717.html

推荐阅读