java中BigDecimal類(lèi)型比較大小和絕對(duì)值計(jì)算方式
BigDecimal類(lèi)型比較大小和絕對(duì)值計(jì)算
涉及到BigDecimal類(lèi)型的比較,最好使用compareTo()方法,不要用equals()方法(除非對(duì)精度有要求)。
關(guān)鍵方法
| 修飾符 | 方法 | 描述 |
|---|---|---|
| BigDecimal | compareTo(BigDecimal val) | 將此 BigDecimal與指定的BigDecimal進(jìn)行 比較,小于返回-1,等于返回0,大于返回1 |
代碼測(cè)試
import java.math.BigDecimal;
//臨時(shí)測(cè)試類(lèi)
public class CalculateTest {
private static BigDecimal X=new BigDecimal("0.4");
private static BigDecimal Y=new BigDecimal("0.5");
private static BigDecimal Z=new BigDecimal("0.6");
private static BigDecimal T=new BigDecimal("0.4");
public static void main(String[] args) {
System.out.println(X.compareTo(Y));
System.out.println(Y.compareTo(X));
System.out.println(X.compareTo(T));
if(X.compareTo(Y)==-1){ //小于
System.out.println(X+"小于"+Y);
}
if(Y.compareTo(X)==1){ //大于
System.out.println(Y+"大于"+X);
}
if(X.compareTo(T)==0){ //等于
System.out.println(X+"等于"+T);
}
if(Z.compareTo(Y)>-1){//大于等于
System.out.println(Z+"大于等于"+Y);
}
if(X.compareTo(Y)<1){//小于等于
System.out.println(X+"小于等于"+Y);
}
//BigDecimal絕對(duì)值計(jì)算
System.out.println(X.subtract(Y).abs());
}
}運(yùn)行結(jié)果:
-1
1
0
0.4小于0.5
0.5大于0.4
0.4等于0.4
0.6大于等于0.5
0.4小于等于0.5
0.1
將equals()方法和compareTo()作比較
BigDecimal a=new BigDecimal("0.1");
BigDecimal b=new BigDecimal("0.100");
System.out.println(a.equals(b));
System.out.println(a.compareTo(b));運(yùn)行結(jié)果:
false
0
我們發(fā)現(xiàn)兩個(gè)的數(shù)值是一樣的,只是精度不同,equals方法判斷不相等,但是compareTo方法判斷結(jié)果為相等,所以equals方法會(huì)考慮精度,但compareTo方法不會(huì)。
常用的BigDecimal的定義和用法
最近涉及到浮點(diǎn)數(shù)金額的一個(gè)運(yùn)算,為了不失精度,想到了之前刷題用過(guò)的BigDecimal,也借此對(duì)它進(jìn)行一個(gè)簡(jiǎn)單的復(fù)習(xí)。
Java在java.math包中提供的API類(lèi)BigDecimal對(duì)超過(guò)16位有效位的數(shù)進(jìn)行精確的運(yùn)算。雙精度浮點(diǎn)型變量double可以處理16位有效數(shù)。
在實(shí)際應(yīng)用中,需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理。float和double只能用來(lái)做科學(xué)計(jì)算或者是工程計(jì)算,在商業(yè)計(jì)算中用java.math.BigDecimal更為精準(zhǔn)。
BigDecimal創(chuàng)建的是對(duì)象,我們不能使用傳統(tǒng)的 +、-、*、/ 等算術(shù)運(yùn)算符直接對(duì)其對(duì)象進(jìn)行數(shù)學(xué)運(yùn)算,而必須調(diào)用其相對(duì)應(yīng)的方法。方法中的參數(shù)也必須是BigDecimal的對(duì)象。

BigDecimal在計(jì)算中體現(xiàn)出來(lái)的精準(zhǔn)度
BigDecimal的用法:
1.BigDecimal有4個(gè)構(gòu)造方法
- BigDecimal(int) 創(chuàng)建一個(gè)具有參數(shù)所指定整數(shù)值的對(duì)象。
- BigDecimal(double) 創(chuàng)建一個(gè)具有參數(shù)所指定雙精度值的對(duì)象。(不建議采用)
- BigDecimal(long) 創(chuàng)建一個(gè)具有參數(shù)所指定長(zhǎng)整數(shù)值的對(duì)象。
- BigDecimal(String) 創(chuàng)建一個(gè)具有參數(shù)所指定以字符串表示的數(shù)值的對(duì)象(優(yōu)先級(jí)最高)
2.BigDecimal常用的加減乘除運(yùn)算
public BigDecimal add(BigDecimal value);??//加法 public BigDecimal subtract(BigDecimal value);??//減法 public BigDecimal multiply(BigDecimal value);??//乘法 public BigDecimal divide(BigDecimal value);?//除法
3.BigDecimal常用的比較大小方法
(int compareTo(Object o)):
BigDecimal的equals方法當(dāng)精度不一樣的時(shí)候也當(dāng)做不相等,而compareTo方法卻可以忽略精度的不同,只比較數(shù)值是否相同。

BigDecimal的compareTo()方法進(jìn)行的是值比較,返回值為-1,0,1:
- num1<num2, 返回-1
- num1=num2,返回0
- num1>num2, 返回1
4.在java中判斷一個(gè)BigDecimal的值和0比較
int i=num.compareTo(BigDecimal.ZERO);
根據(jù) i 的值是 -1 or 0 or 1,即可判斷 小于 or 等于 or 大于關(guān)系
boolean flag = num.equals(BigDecimal.ZERO)
直接根據(jù) flag 的 true、false 進(jìn)行判斷
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀
這篇文章主要介紹了Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀,UDP協(xié)議全稱(chēng)是用戶(hù)數(shù)據(jù)報(bào)協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議,在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層,需要的朋友可以參考下2023-12-12
Fluent Mybatis學(xué)習(xí)之Update語(yǔ)法實(shí)踐
Fluent MyBatis是一個(gè)MyBatis的增強(qiáng)工具,沒(méi)有對(duì)mybatis做任何修改。本篇文章將詳細(xì)介紹對(duì)Fluent Mybatis中的update語(yǔ)法進(jìn)行驗(yàn)證。代碼具有一定價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2021-11-11
MySQL中沒(méi)有MVCC機(jī)制的影響分析與替代方案
本文深入探討了如果 MySQL 中沒(méi)有多版本并發(fā)控制(MVCC)機(jī)制會(huì)帶來(lái)什么影響,分析了各種并發(fā)問(wèn)題,提供了替代解決方案,并通過(guò)代碼示例和流程圖進(jìn)行詳細(xì)說(shuō)明,需要的朋友可以參考下2025-10-10
java管道piped輸入流與輸出流應(yīng)用場(chǎng)景案例分析
這篇文章主要介紹了java管道流PipedInputStream與PipedOutputStream(輸入流與輸出流)的應(yīng)用場(chǎng)景案例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
一篇文章帶你了解一些Java反射的學(xué)習(xí)記錄
java反射機(jī)制是一個(gè)很好用的東西,用它可以解決很多死的東西,因?yàn)榉瓷錂C(jī)制的靈活行很大,有了他,我們就不要花太多的時(shí)間來(lái)寫(xiě)操做數(shù)據(jù)庫(kù)的代碼了,這個(gè)可以很大的減少開(kāi)發(fā)時(shí)間,而且代碼的可讀性好2021-09-09
MyBatis-Plus實(shí)現(xiàn)公共字段自動(dòng)填充功能詳解
在開(kāi)發(fā)中經(jīng)常遇到多個(gè)實(shí)體類(lèi)有共同的屬性字段,這些字段屬于公共字段,也就是很多表中都有這些字段,能不能對(duì)于這些公共字段在某個(gè)地方統(tǒng)一處理,來(lái)簡(jiǎn)化開(kāi)發(fā)呢?MyBatis-Plus就提供了這一功能,本文就來(lái)為大家詳細(xì)講講2022-08-08
Spring?BOOT?AOP基礎(chǔ)應(yīng)用教程
這篇文章主要介紹了Spring?BOOT?AOP的使用,文章從相關(guān)問(wèn)題展開(kāi)全文內(nèi)容詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享
這篇文章主要介紹了intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02

