关闭页面特效

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

1|0为什么使用decmical


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

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

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

2|0decimal


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

decimal(a,b) a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。

b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。

3|0BigDecimal


Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

4|0BigDecimal的四则运算


 

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

 

5|0BigDecimal 的 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




__EOF__

作  者HKnight
出  处https://www.cnblogs.com/HKnight/p/12923717.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   HKnight  阅读(5474)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
0
0
关注
跳至底部
点击右上角即可分享
微信分享提示