亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Java Bigdecimal使用原理詳解

瀏覽:3日期:2022-09-04 13:47:59

一般來說,一提到Java里面的商業計算,我們都知道不能用float和double,因為他們無法進行精確計算。但是Java的設計者給編程人員提供了一個很有用的類BigDecimal,他可以完善float和double類無法進行精確計算的缺憾。

BigDecimal類位于java.maths類包下。首先我們來看下如何構造一個BigDecimal對象。它的構造函數很多,這里挑選最常用的兩個來演示一下:一個就是BigDecimal(double val),另一個就是BigDecimal(String str)。這兩個看上去沒什么太大區別,但是正像API描述中說:

/*The results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding.The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal('.1') is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.*/

也就是說利用double作為參數的構造函數,無法精確構造一個BigDecimal對象,需要自己指定一個上下文的環境,也就是指定精確位。而利用String對象作為參數傳入的構造函數能精確的構造出一個BigDecimal對象。請看下面的代碼:

import java.math.*;public class TestBigDecimal { public static void main(String args[]){ BigDecimal bd = new BigDecimal( '10.123'); BigDecimal bd1 = new BigDecimal(10.123); System.out.println(bd +'/n'+ bd1); }}運行后輸出:10.12310.1229999999999993320898283855058252811431884765625

所以我們在選擇構造函數時,要看具體需求而定。

另外,很多人會問到怎么將基本類型,如int,float,double,long,和BigDecimal對象相互轉換。很簡單:

基本類型通過構造函數轉換成對應的BigDecimal對象,而BigDecimal類提供了諸如intValue(), floatValue(), doubleValue(), longValue()方法來將BigDecimal對象轉換成對應的值。

一、BigDecimal 的加減乘除

BigDecimal bignum1 = new BigDecimal('10'); BigDecimal bignum2 = new BigDecimal('5'); BigDecimal bignum3 = null; //加法 bignum3 = bignum1.add(bignum2); System.out.println('和 是:' + bignum3); //減法 bignum3 = bignum1.subtract(bignum2); System.out.println('差 是:' + bignum3); //乘法 bignum3 = bignum1.multiply(bignum2); System.out.println('積 是:' + bignum3); //除法 bignum3 = bignum1.divide(bignum2); System.out.println('商 是:' + bignum3);

二、BigDecimal 的比較大小。

BigDecimal num1 = new BigDecimal('0'); BigDecimal num2 = new BigDecimal('1'); BigDecimal num3 = new BigDecimal('2'); BigDecimal num = new BigDecimal('1'); //用做比較的值 System.out.println(num1.compareTo(num)); //小于 時,返回 -1 System.out.println(num2.compareTo(num)); //等于 時,返回 0 System.out.println(num3.compareTo(num)); //大于 時,返回 1

補充:

BigInteger 也可以存放比較大的數, 和 BigDecimal 的區別是 :BigInteger 存放的是大的整數,而BigDecimal 存放大的小數

繼續補充一下,用BigDecimal 寫個for循環。

for (BigDecimal i = new BigDecimal('0'); i.compareTo(new BigDecimal('10')) != 1; i = i.add(new BigDecimal('1'))) { System.out.print(i + 't'); }

控制臺打印的是從0 到 10 。

三、Java中的BigDecimal使用注意事項

1.BigDecial是immutable的,就像String一樣,它的所有操作都會生成一個新的對象,所以

amount.add( thisAmount );

是錯誤的;而應該是:

amount = amount.add( thisAmount );

2. 不要用equals方法來比較BigDecimal對象,因為它的equals方法會比較scale,如果scale不一樣,它會返回false;

BigDecimal a = new BigDecimal('2.00');BigDecimal b = new BigDecimal('2.0');print(a.equals(b)); // false

所以你應該使用compareTo()和signum()方法

a.compareTo(b); // returns (-1 if a < b), (0 if a == b), (1 if a > b)a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)

3. 使用BigDecimal的字符串構造函數,不要使用double參數的構造函數,否則的話會出現你不想要的結果。

例如下面的代碼分別使用double和String的構造函數,然后使用HALF_EVEN的round方法,但是輸出結果不一樣

System.out.println('=================='); for(int i = 0; i < 10; i ++) { StringBuffer sb = new StringBuffer(); sb.append('0.'); sb.append(i); sb.append('5'); BigDecimal bdx = new BigDecimal(sb.toString()); System.out.println(sb + ' ' +bdx.setScale(1, RoundingMode.HALF_EVEN)); } System.out.println('=================='); for(int i = 0; i < 10; i ++) { StringBuffer sb = new StringBuffer(); sb.append('0.'); sb.append(i); sb.append('5'); BigDecimal bdx = new BigDecimal(Double.valueOf(sb.toString())); System.out.println(sb + ' ' +bdx.setScale(1, RoundingMode.HALF_EVEN)); }

輸出是:

==================0.05 0.00.15 0.20.25 0.20.35 0.40.45 0.40.55 0.60.65 0.60.75 0.80.85 0.80.95 1.0==================0.05 0.10.15 0.10.25 0.20.35 0.30.45 0.50.55 0.60.65 0.70.75 0.80.85 0.80.95 0.9

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 国产日韩一区二区三区在线观看 | 欧美一级特黄aa大片 | 麻豆性视频 | 一级片视频免费 | 久久久精品久久久久三级 | 成人午夜在线观看国产 | 国产成人污污网站在线观看 | 国产淫语对白在线视频 | 久久免费视频精品 | 国产亚洲精品久久久久久久网站 | 污污网站免费入口链接 | 久久国产精品-久久精品 | 中文字幕一区二区在线视频 | 国产v国产v片大片线观看网站 | 色狠狠一区二区三区香蕉蜜桃 | 国产免费福利 | 日本wwwwwxxxxx| 国产美女一级特黄毛片 | 高清在线一区 | 国产白拍 | 国产a一级毛片午夜剧院 | 欧美黑人与白人做爰 | 91射射射| 欧美人与善交大片 | 欧美洲精品亚洲精品中文字幕 | 国产一级黄色影片 | 五月丁六月停停 | 新一级毛片国语版 | 亚洲qingse中文久久网 | 九一国产在线观看 | 成人一区专区在线观看 | 日韩欧美在线综合网高清 | 91草草| 免费看的黄色录像 | 欧美成人看片黄a免费 | 一区二区三区四区视频在线观看 | 黄色自拍视频 | 在线观看的黄网 | 久久性妇女精品免费 | 一级二级三级黄色片 | 免费看黄色一级 |