BigDecimal怎么比較大小?
BigDecimal a = new BigDecimal("1.00");
BigDecmial b = new BigDecimal(1);
想比較一下a和b的大小,一般都會(huì)用equals
System.out.println(a.equals(b));
但是輸出結(jié)果是:fal
原因是:BigDecimal比較時(shí),不僅比較值,而且還比較精度?
if(a.compareTo(b)==0) 結(jié)果是true
比較大小可以用 a.compareTo(b)
返回值 -1 小于 0 等于 1 大于
java 中 BigDecimal 怎么與 0 比較
如果不確定 bigDecimal 的范圍,可以把 0 轉(zhuǎn)化為 bigDecimal類型的,然后用其 equals方法進(jìn)行比較
BigDecimal bd1 =... ;//其中的一個(gè)bigDecimal對(duì)象
BigDecimal bd2 = new BigDecimal(0) //把 0 轉(zhuǎn)為 BigDecimal
就可以用 bd1.CompareTo(bd2) 根據(jù)返回值進(jìn)行比較
在JAVA中怎么比較Double類型數(shù)據(jù)的大小
你如果是要普通比較直接用數(shù)學(xué)符號(hào)即可,指的在其jvm允許的范圍內(nèi)如果,你是要很準(zhǔn)確的精度比較運(yùn)算,由于精度問(wèn)題,可能會(huì)有誤差,建議使用BigDecimal類型!
//普通比較
Doubleobj1=newDouble("0.001");
Doubleobj2=newDouble("0.0011");
obj1.compareTo(obj2);
//精度準(zhǔn)確比較
doublea=obj1;
doubleb=obj2;
BigDecimaldata1=newBigDecimal(a);
BigDecimaldata2=newBigDecimal(b);
data1.compareTo(data2);
//該方法兩種類都有
publicintcompareTo(BigDecimalval)
/*將此BigDecimal與指定的BigDecimal比較。根據(jù)此方法,值相等但具有不同標(biāo)度的兩個(gè)BigDecimal對(duì)象(如,2.0和2.00)被認(rèn)為是相等的。相對(duì)六個(gè)boolean比較運(yùn)算符(<,==,>,>=,!=,<=)中每一個(gè)運(yùn)算符的各個(gè)方法,優(yōu)先提供此方法。
*參數(shù):val-將此BigDecimal與之比較的BigDecimal。
*返回:當(dāng)此BigDecimal在數(shù)字上小于、等于或大于val時(shí),返回-1、0或1。
*/
BigInteger與BigDecimal
BigInteger - 廖雪峰的網(wǎng)站
在Java中,由CPU原生提供的整型最大范圍是64位 long 型整數(shù)。使用 long 型整數(shù)可以直接通過(guò)CPU指令進(jìn)行計(jì)算,速度非常快。
如果我們使用的整數(shù)范圍超過(guò)了 long 型怎么辦?這個(gè)時(shí)候,就只能用軟件來(lái)模擬一個(gè)大整數(shù)。 java.math.BigInteger 就是用來(lái)表示任意大小的整數(shù)。 BigInteger 內(nèi)部用一個(gè) int[] 數(shù)組來(lái)模擬一個(gè)非常大的整數(shù):
對(duì) BigInteger 做運(yùn)算的時(shí)候,只能使用實(shí)例方法,例如,加法運(yùn)算:
和 long 型整數(shù)運(yùn)算比, BigInteger 不會(huì)有范圍限制,但缺點(diǎn)是速度比較慢。
也可以把 BigInteger 轉(zhuǎn)換成 long 型:
使用 longValueExact() 方法時(shí),如果超出了 long 型的范圍,會(huì)拋出 ArithmeticException 。
BigInteger 和 Integer 、 Long 一樣,也是不可變類,并且也繼承自 Number 類。因?yàn)?Number 定義了轉(zhuǎn)換為基本類型的幾個(gè)方法:
因此,通過(guò)上述方法,可以把 BigInteger 轉(zhuǎn)換成基本類型。如果 BigInteger 表示的范圍超過(guò)了基本類型的范圍,轉(zhuǎn)換時(shí)將丟失高位信息,即結(jié)果不一定是準(zhǔn)確的。如果需要準(zhǔn)確地轉(zhuǎn)換成基本類型,可以使用 intValueExact() 、 longValueExact() 等方法,在轉(zhuǎn)換時(shí)如果超出范圍,將直接拋出 ArithmeticException 異常。
如果 BigInteger 的值甚至超過(guò)了 float 的最大范圍,那么返回的 float 是什么呢?
和 BigInteger 類似, BigDecimal 可以表示一個(gè)任意大小且精度完全準(zhǔn)確的浮點(diǎn)數(shù)。
通過(guò) BigDecimal 的 stripTrailingZeros() 方法,可以將一個(gè) BigDecimal 格式化為一個(gè)相等的,但去掉了末尾0的 BigDecimal :
如果一個(gè) BigDecimal 的 scale() 返回負(fù)數(shù),例如, -2 ,表示這個(gè)數(shù)是個(gè)整數(shù),并且末尾有2個(gè)0。
可以對(duì)一個(gè) BigDecimal 設(shè)置它的 scale ,如果精度比原始值低,那么按照指定的方法進(jìn)行四舍五入或者直接截?cái)啵?br />
對(duì) BigDecimal 做加、減、乘時(shí),精度不會(huì)丟失,但是做除法時(shí),存在無(wú)法除盡的情況,這時(shí),就必須指定精度以及如何進(jìn)行截?cái)啵?br />
還可以對(duì) BigDecimal 做除法的同時(shí)求余數(shù):
調(diào)用 divideAndRemainder() 方法時(shí),返回的數(shù)組包含兩個(gè) BigDecimal ,分別是商和余數(shù),其中商總是整數(shù),余數(shù)不會(huì)大于除數(shù)。我們可以利用這個(gè)方法判斷兩個(gè) BigDecimal 是否是整數(shù)倍數(shù):
在比較兩個(gè) BigDecimal 的值是否相等時(shí),要特別注意,使用 equals() 方法不但要求兩個(gè) BigDecimal 的值相等,還要求它們的 scale() 相等:
必須使用 compareTo() 方法來(lái)比較,它根據(jù)兩個(gè)值的大小分別返回負(fù)數(shù)、正數(shù)和0,分別表示小于、大于和等于。
總是使用 compareTo() 比較兩個(gè) BigDecimal 的值,不要使用 equals() !
如果查看 BigDecimal 的源碼,可以發(fā)現(xiàn),實(shí)際上一個(gè) BigDecimal 是通過(guò)一個(gè) BigInteger 和一個(gè) scale 來(lái)表示的,即 BigInteger 表示一個(gè)完整的整數(shù),而 scale 表示小數(shù)位數(shù):
BigDecimal 也是從 Number 繼承的,也是不可變對(duì)象。
java中BigDecimal怎么與0比較?
標(biāo)準(zhǔn)做法x0dx0aintr=big_decimal.compareTo(BigDecimal.Zero);//和0,Zero比較x0dx0aif(r==0)//等于x0dx0aif(r==1)//大于x0dx0aif(r==-1)//小于x0dx0ax0dx0a或者x0dx0aif(big_decimal.equals(BigDecimal.Zero))//是否等于0
c語(yǔ)言中double類型值的大小比較
由于double浮點(diǎn)數(shù)的精度問(wèn)題,所以在比較大小的時(shí)候,不能像int整數(shù)型那樣,直接if(a==b),if(a<b),if(a>b)。
要使用一個(gè)精度EPS:
const double EPS = 1e-6; //一般這樣子就夠,但有時(shí)具體題目要考慮是否要更小的 ;
if(fabs(a-b) < EPS) //判斷是否相等 ;
if(a > b+EPS) // 判斷a是否大于b,因?yàn)榇蟮目隙ù螅约词鼓阈〉募由希€是會(huì)更大 。
擴(kuò)展資料
JAVA double類型比較大小
@org.junit.Test
public void Test(){
BigDecimal big = new BigDecimal(1);
BigDecimal Graphicprice = new BigDecimal(0.01);//圖文價(jià)格
BigDecimal Speechprice = new BigDecimal(0.02);//語(yǔ)音價(jià)格
BigDecimal Videoprice = new BigDecimal(1);//視頻價(jià)格
System.out.println(Graphicprice + " " + Speechprice +" " + Videoprice);
if(Graphicprice.compareTo(big)<0 || Graphicprice.compareTo(big)==0 ||
Speechprice.compareTo(big)<0 || Speechprice.compareTo(big)==0 ||
Videoprice.compareTo(big)<0 || Videoprice.compareTo(big)==0){
System.out.println("ok");
}
}