日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

biginteger 原理_Java Bigdecimal使用原理详解

發布時間:2023/12/19 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 biginteger 原理_Java Bigdecimal使用原理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一般來說,一提到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.123

10.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.0

0.15 0.2

0.25 0.2

0.35 0.4

0.45 0.4

0.55 0.6

0.65 0.6

0.75 0.8

0.85 0.8

0.95 1.0

==================

0.05 0.1

0.15 0.1

0.25 0.2

0.35 0.3

0.45 0.5

0.55 0.6

0.65 0.7

0.75 0.8

0.85 0.8

0.95 0.9

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

總結

以上是生活随笔為你收集整理的biginteger 原理_Java Bigdecimal使用原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本少妇裸体做爰高潮片 | av一起看香蕉 | 羞羞的软件 | 又色又爽又黄gif动态图 | 精品人妻人人做人人爽夜夜爽 | 朝鲜女人性猛交 | 国产高清在线观看 | 亚洲男人天堂视频 | 丁香婷婷亚洲 | 色呦呦视频| 日日热| 777奇米色| 国产超级av| 国产第一页在线播放 | 欧美激情免费观看 | 国产在线精品成人欧美 | 亚洲视频www | 天天色天天射综合网 | 樱花草涩涩www在线播放 | 99久精品视频 | 亚洲欧美视频 | 激情五月网站 | 欧美精品福利视频 | 欧美色图3p | 日本h片在线观看 | 婷婷中文字幕在线 | 丰满孕妇性春猛交xx大陆 | 日韩美女在线视频 | 亚洲色欲色欲www | 日本黄色一区二区 | 伊人久久中文字幕 | 欧美乱轮视频 | 超碰人人草人人干 | 午夜影院免费看 | 99久久精品日本一区二区免费 | 欧美一区二区三区不卡视频 | 成人合集 | 超碰99在线 | 五月婷婷狠狠干 | 阿的白色内裤hd中文 | 国产精品国产一区二区 | 国产性―交―乱―色―情人 | 中文字幕av免费观看 | 激情欧美综合 | 午夜亚洲精品 | 我要看一级黄色片 | 久久视频精品 | 亚洲二区在线播放视频 | 色亚洲色图 | 国产精品va无码一区二区 | 高h奶汁双性受1v1 | 在线激情小视频 | 亚洲一区二区三区国产 | wwww黄色片| 风间由美一二三区av片 | 国产欧美一区二区三区四区 | 桃谷绘里香番号 | 爱爱91| 日日射日日干 | 国产精品久久久99 | 一区二区视频网 | 久久成人免费视频 | 九久久久久 | 日本69视频 | 好爽又高潮了毛片 | 亚洲精品视频在线免费 | 色啊色| 免费观看在线播放 | 亚洲国产网站 | 日韩欧美成人免费视频 | 中国黄色片视频 | 国产无人区码熟妇毛片多 | 特级毛片在线播放 | 国产91在线高潮白浆在线观看 | 国产小视频免费在线观看 | 干爹你真棒插曲mv在线观看 | 亚洲色图吧 | 男女午夜视频在线观看 | 被绑在床强摁做开腿呻吟 | 亚洲综合av网 | 成人美女毛片 | 国产真实的和子乱拍在线观看 | 精品人妻天天爽夜夜爽视频 | 亚洲国产精品久久久久爰性色 | 第九色 | 狠狠操你 | 国产亚洲欧美日韩高清 | а√天堂8资源在线官网 | 欧美综合视频 | 粉嫩aⅴ一区二区三区四区五区 | 成人极品 | 精品无码一区二区三区的天堂 | 91调教打屁股xxxx网站 | 日本一本在线视频 | 日韩一级高清 | 欧洲一区二区三区 | 成人免费视频国产免费网站 | 一级a性色生活片久久毛片 爱爱高潮视频 | 欧美亚洲91 |