在java中,用什么類型處理小數(shù)构罗,一般下意識會想到float和double铜涉。
首先,為什么是這兩個呢遂唧?
1.好用,單詞寫起來簡單芙代,記也好記,拼讀發(fā)音也不容易錯盖彭。
float ?f = 1.1f;
double d = 1.2f;
2.四折運算(加減乘除)簡單
float f1 = 1.2f;
float f2 = 1.3f;
float f3 = f2 - f1; ?
System.out.println(f3); //0.099999905
double d1 = 1.2f;
double d2 = 1.3f;
double d3= d2 - d1;
System.out.println(f3); //0.09999990463256836
再來看看BigDecimail纹烹,首先名字忒長,接著看看用法。
BigDecimail b1= new BigDecimail("1.2");
BigDecimail b1= new BigDecimail("1.3"); ?//怕寫錯召边,直接復(fù)制上面的铺呵,只將2改成了3,為什么這里1.3 變成了“1.3”?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//因為編譯器二進制無法精確地表示十進制小數(shù)1.3隧熙,當它讀到1.3時片挂,會將1.3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //用8個字節(jié)的double值表示,可能你打印輸出變成了 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//1.3000000000000000444089209850062616169452667236328125
BigDecimail b3 = b2.subtract(b1) ;//
b3.setScale(1,RoundingMode.HALF_UP);
System.out.println(b3); ? //0.1
至此,應(yīng)該看到了最大的問題吧。精度不一樣音念,可能會造成很大的問題沪饺。1和0.99 ?都乘以1000 ?就相差了10,BigDecimail 可以有好幾種定義精度的模式闷愤。而且值按道理是可以無限大的整葡。由于BigDecimail性能肯定比不了int和long, 在小范圍的值可以用int讥脐,long 來替換(*1000 之類的后面再除)遭居。但是超過18位,就一定要用BigDecimail旬渠。當然咯魏滚,如果對值的精確要求不是特別高,還是可以使用float和double的坟漱。