Java程式設計中,什麼資料型別適合用來表示價格?
阿新 • • 發佈:2019-02-02
我在看書時候偶然看到這個問題,我的第一反應:這還用問嘛!!!float和double都可以呀。(這充分說明了我是java初學者。。。)
不過,好學的我,還是想看看答案到底寫了個啥。答案如下:
在初學Java的時候,我們知道float和double都表示浮點數。但是由於float和double所表示的浮點數是近似值,不是精確的值,因此,二者不適合作為價格的資料型別。Java語言提供了另外一種資料型別BigDecimal,可以表示精確的浮點數,適合用作財務計算的資料型別。但是需要注意的是,在使用BigDecimal的時候,BigDecimal有多個過載的構造方法能表示精度的值,只有用引數為String型別的構造方法才能表示。
看到此,我還是處於懷疑人生狀態。。。
來個例子瞧瞧:
import java.math.BigDecimal; public class Test { public static void main(String[] args) { float d1 = 2.15f; float d2 = 1.10f; System.out.println("float型別運算結果:\n" + d1 + "-" + d2 + "=" + (d1 -d2) + "\n"); double d3 = 2.15; double d4 = 1.10; System.out.println("double型別運算結果:\n" + d3 + "-" + d4 + "=" + (d3 -d4) + "\n"); BigDecimal bd1 = new BigDecimal("2.15"); BigDecimal bd2 = new BigDecimal("1.10"); System.out.println("BigDecimal,引數為String型別運算結果:\n" + bd1 + "-" + bd2 + "=" + bd1.subtract(bd2) + "\n"); BigDecimal bd3 = new BigDecimal(2.15); BigDecimal bd4 = new BigDecimal(1.10); System.out.println("BigDecimal,引數為double型別時運算結果:\n" + bd3 + "-" + bd4 + "=" + bd3.subtract(bd4) + "\n"); } }
執行結果:
呀!!!還真是介個樣紙!!!
對於BigDecimal(),
java.math.BigDecimal.BigDecimal(String val)
public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}
java.math.BigDecimal.BigDecimal(double val) 這個函式計算不精確的原因,恐怕還是double惹的禍吧public char[] toCharArray() { char result[] = new char[value.length]; System.arraycopy(value, 0, result, 0, value.length); return result; }
public BigDecimal(double val) {
this(val,MathContext.UNLIMITED);
}
哎!我還是趕緊把基本資料型別在記憶體中怎麼儲存的,好好學學吧!