最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Bigdecimal使用原理詳解

 更新時(shí)間:2020年03月16日 14:21:19   作者:SweetLove  
這篇文章主要介紹了Java Bigdecimal使用原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一般來說,一提到Java里面的商業(yè)計(jì)算,我們都知道不能用float和double,因?yàn)樗麄儫o法進(jìn)行精確計(jì)算。但是Java的設(shè)計(jì)者給編程人員提供了一個(gè)很有用的類BigDecimal,他可以完善float和double類無法進(jìn)行精確計(jì)算的缺憾。

BigDecimal類位于java.maths類包下。首先我們來看下如何構(gòu)造一個(gè)BigDecimal對象。它的構(gòu)造函數(shù)很多,這里挑選最常用的兩個(gè)來演示一下:一個(gè)就是BigDecimal(double val),另一個(gè)就是BigDecimal(String str)。這兩個(gè)看上去沒什么太大區(qū)別,但是正像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作為參數(shù)的構(gòu)造函數(shù),無法精確構(gòu)造一個(gè)BigDecimal對象,需要自己指定一個(gè)上下文的環(huán)境,也就是指定精確位。而利用String對象作為參數(shù)傳入的構(gòu)造函數(shù)能精確的構(gòu)造出一個(gè)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);
 }
}
運(yùn)行后輸出:

10.123
10.1229999999999993320898283855058252811431884765625

所以我們在選擇構(gòu)造函數(shù)時(shí),要看具體需求而定。

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

基本類型通過構(gòu)造函數(shù)轉(zhuǎn)換成對應(yīng)的BigDecimal對象,而BigDecimal類提供了諸如intValue(), floatValue(), doubleValue(), longValue()方法來將BigDecimal對象轉(zhuǎn)換成對應(yīng)的值。

一、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)); //小于 時(shí),返回 -1 
System.out.println(num2.compareTo(num)); //等于 時(shí),返回 0 
System.out.println(num3.compareTo(num)); //大于 時(shí),返回 1

補(bǔ)充:

BigInteger 也可以存放比較大的數(shù), 和 BigDecimal 的區(qū)別是 :BigInteger 存放的是大的整數(shù),而BigDecimal 存放大的小數(shù)

繼續(xù)補(bǔ)充一下,用BigDecimal 寫個(gè)for循環(huán)。

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

控制臺(tái)打印的是從0 到 10 。

三、Java中的BigDecimal使用注意事項(xiàng)

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

amount.add( thisAmount );

是錯(cuò)誤的;而應(yīng)該是:

amount = amount.add( thisAmount );

2. 不要用equals方法來比較BigDecimal對象,因?yàn)樗膃quals方法會(huì)比較scale,如果scale不一樣,它會(huì)返回false;

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

所以你應(yīng)該使用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的字符串構(gòu)造函數(shù),不要使用double參數(shù)的構(gòu)造函數(shù),否則的話會(huì)出現(xiàn)你不想要的結(jié)果。

例如下面的代碼分別使用double和String的構(gòu)造函數(shù),然后使用HALF_EVEN的round方法,但是輸出結(jié)果不一樣

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring?Cloud中Sentinel的兩種限流模式介紹

    Spring?Cloud中Sentinel的兩種限流模式介紹

    如何使用Sentinel做流量控制呢?這篇文章就來為大家詳細(xì)介紹了Spring?Cloud中Sentinel的兩種限流模式,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • SpringBoot @SpringBootTest加速單元測試的小訣竅

    SpringBoot @SpringBootTest加速單元測試的小訣竅

    這篇文章主要介紹了SpringBoot @SpringBootTest加速單元測試的小訣竅,具有很好的參考價(jià)值,對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java String 拼接字符串原理詳解

    Java String 拼接字符串原理詳解

    在本篇文章里小編給大家分享的是關(guān)于Java String 拼接字符串原理詳解的相關(guān)資源內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2020-02-02
  • SpringBoot中@EnableAutoConfiguration注解的實(shí)現(xiàn)

    SpringBoot中@EnableAutoConfiguration注解的實(shí)現(xiàn)

    Spring Boot@EnableAutoConfiguration是一個(gè)強(qiáng)大的工具,可以簡化配置過程,從而實(shí)現(xiàn)快速開發(fā),本文主要介紹了SpringBoot中@EnableAutoConfiguration注解的實(shí)現(xiàn),感興趣的可以了解一下
    2024-01-01
  • 詳解XML,Object,Json轉(zhuǎn)換與Xstream的使用

    詳解XML,Object,Json轉(zhuǎn)換與Xstream的使用

    這篇文章主要介紹了詳解XML,Object,Json轉(zhuǎn)換與Xstream的使用的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java中使用開源庫JSoup解析HTML文件實(shí)例

    Java中使用開源庫JSoup解析HTML文件實(shí)例

    這篇文章主要介紹了Java中使用開源庫JSoup解析HTML文件實(shí)例,Jsoup是一個(gè)開源的Java庫,它可以用于處理實(shí)際應(yīng)用中的HTML,比如常見的HTML格式化就可以用它來實(shí)現(xiàn),需要的朋友可以參考下
    2014-09-09
  • Java方法遞歸與輸入輸出深入探索

    Java方法遞歸與輸入輸出深入探索

    這篇文章主要介紹了Java方法遞歸與輸入輸出的相關(guān)資料,方法遞歸是一種在方法內(nèi)部調(diào)用自身的技術(shù),適用于具有遞歸結(jié)構(gòu)的問題,輸入輸出是Java程序與外部世界交互的橋梁,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Java多線程Queue、BlockingQueue和使用BlockingQueue實(shí)現(xiàn)生產(chǎn)消費(fèi)者模型方法解析

    Java多線程Queue、BlockingQueue和使用BlockingQueue實(shí)現(xiàn)生產(chǎn)消費(fèi)者模型方法解析

    這篇文章主要介紹了Java多線程Queue、BlockingQueue和使用BlockingQueue實(shí)現(xiàn)生產(chǎn)消費(fèi)者模型方法解析,涉及queue,BlockingQueue等有關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以參考。
    2017-11-11
  • SpringBoot如何通過Map實(shí)現(xiàn)策略模式

    SpringBoot如何通過Map實(shí)現(xiàn)策略模式

    策略模式是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)選擇算法的行為,在Spring框架中,我們可以利用@Resource注解和Map集合來優(yōu)雅地實(shí)現(xiàn)策略模式,這篇文章主要介紹了SpringBoot如何通過Map實(shí)現(xiàn)策略模式,需要的朋友可以參考下
    2025-03-03
  • spring boot+mybatis 多數(shù)據(jù)源切換(實(shí)例講解)

    spring boot+mybatis 多數(shù)據(jù)源切換(實(shí)例講解)

    下面小編就為大家?guī)硪黄猻pring boot+mybatis 多數(shù)據(jù)源切換(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

安达市| 东光县| 合阳县| 婺源县| 和平县| 资中县| 咸丰县| 灵川县| 西青区| 晋州市| 云林县| 佛学| 新闻| 江口县| 吴旗县| 徐闻县| 顺昌县| 大石桥市| 建昌县| 景宁| 广水市| 永康市| 阿图什市| 扶绥县| 阳泉市| 昭觉县| 赣榆县| 定日县| 新蔡县| 历史| 汤阴县| 尼勒克县| 衡南县| 社会| 利辛县| 兴隆县| 许昌县| 水城县| 手机| 高安市| 蒲江县|