Java語(yǔ)言中提供了兩種浮點(diǎn)類型: float和double。
float類型占用4個(gè)字節(jié),double類型占用8個(gè)字節(jié)。由于double類型的精度更高,因此在實(shí)際開發(fā)中大多數(shù)情況下使用double類型。
float f = 1.23f; // 注意要在數(shù)字后加上f表示這是一個(gè)float類型 double d = 4.56;
由于浮點(diǎn)數(shù)是用二進(jìn)制表示的,而二進(jìn)制小數(shù)無法精確地表示所有的10進(jìn)制小數(shù),因此浮點(diǎn)數(shù)計(jì)算可能會(huì)出現(xiàn)精度誤差。
double a = 0.1; double b = 0.2; double c = a + b; System.out.println(c); //輸出結(jié)果為0.30000000000000004
為了避免精度誤差影響程序的正確性,我們可以使用BigDecimal類進(jìn)行精確計(jì)算。下面是一個(gè)使用BigDecimal計(jì)算浮點(diǎn)數(shù)的例子:
import java.math.BigDecimal; public class Main { public static void main(String[] args) { BigDecimal a = new BigDecimal("0.1"); BigDecimal b = new BigDecimal("0.2"); BigDecimal c = a.add(b); System.out.println(c); //輸出結(jié)果為0.3 } }
另外一個(gè)需要注意的問題是浮點(diǎn)數(shù)的比較。由于浮點(diǎn)數(shù)的精度誤差,直接使用等于號(hào)進(jìn)行比較可能會(huì)出現(xiàn)問題。因此我們通常將比較操作定義為一個(gè)誤差范圍內(nèi)的差值。
double a = 1.23456789; double b = 1.23456790; if (Math.abs(a - b)< 0.000001) { System.out.println("相等"); } else { System.out.println("不相等"); }
在日常開發(fā)中,我們通常使用double類型來表示浮點(diǎn)數(shù)。