JAVA里的BigDecimal用法

public class BigDecimaldemo1 {public static void main(String[] args) {System.out.println(0.09+0.01);//為什么不是0.10呢?}
}

在使用float或者double類型的數據在進行數學運算的時候,很有可能會產生精度丟失問題。我們都知道計算機底層在進行運算的時候,使用的都是二進制數據; ?

趨近于這個十進數的二進制數據; 這樣使用一個不太準確的數據進行運算的時候, 最終就會造成精度丟失;為了提高精度,Java就給我們提供了BigDecimal供我們進行數據運算。 ?

構造方法?

1.通過傳遞double類型的小數來創建對象

//1.通過傳遞double類型的小數來創建對象BigDecimal bd1 = new BigDecimal(0.01);BigDecimal bd2 = new BigDecimal(0.09);System.out.println(bd1.add(bd2));

2.通過傳遞字符串表示的小數來創建對象

 //2.通過傳遞字符串表示的小數來創建對象BigDecimal bd3=new BigDecimal("3.14");BigDecimal bd4=new BigDecimal("1.11");System.out.println(bd3.add(bd4));

3.通過靜態方法來獲取對象

 BigDecimal bd5=BigDecimal.valueOf(10.0);BigDecimal bd6=BigDecimal.valueOf(10.0);System.out.println(bd5==bd6);

常見成員方法

public BigDecimal add(BigDecimal value)?? ??? ??? ??? ?// 加法運算
public BigDecimal subtract(BigDecimal value)?? ??? ?// 減法運算
public BigDecimal multiply(BigDecimal value)?? ??? ?// 乘法運算
public BigDecimal divide(BigDecimal value)?? ??? ??? ?// 觸發運算

?

public class BigDecimalDemo01 {public static void main(String[] args) {// 創建兩個BigDecimal對象BigDecimal b1 = new BigDecimal("0.3") ;BigDecimal b2 = new BigDecimal("4") ;// 調用方法進行b1和b2的四則運算,并將其運算結果在控制臺進行輸出System.out.println(b1.add(b2));         // 進行加法運算System.out.println(b1.subtract(b2));    // 進行減法運算System.out.println(b1.multiply(b2));    // 進行乘法運算System.out.println(b1.divide(b2));      // 進行除法運算}}

運行程序進行測試,控制臺輸出結果如下:

4.3
-3.7
1.2
0.075

如果使用BigDecimal類型的數據進行除法運算的時候,得到的結果是一個無限循環小數,那么就會報錯:ArithmeticException。 如下代碼所示:

public class BigDecimalDemo02 {public static void main(String[] args) {// 創建兩個BigDecimal對象BigDecimal b1 = new BigDecimal("1") ;BigDecimal b2 = new BigDecimal("3") ;// 調用方法進行b1和b2的除法運算,并且將計算結果在控制臺進行輸出System.out.println(b1.divide(b2));}}

運行程序進行測試,控制臺輸出結果如下所示:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
?

針對這個問題怎么解決,此時我們就需要使用到BigDecimal類中另外一個divide方法,如下所示:

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

上述divide方法參數說明:

divisor:?? ??? ??? ?除數對應的BigDecimal對象;
scale:?? ??? ??? ??? ?精確的位數;
roundingMode:?? ??? ?取舍模式;
取舍模式被封裝到了RoundingMode這個枚舉類中(關于枚舉我們后期再做重點講解),在這個枚舉類中定義了很多種取舍方式。最常見的取舍方式有如下幾個:
UP(直接進1) , FLOOR(直接刪除) , HALF_UP(4舍五入),我們可以通過如下格式直接訪問這些取舍模式:枚舉類名.變量名

public class BigDecimaldemo2 {public static void main(String[] args) {// 演示取舍模式HALF_UP// 創建兩個BigDecimal對象BigDecimal b1 = new BigDecimal("0.95") ;BigDecimal b2 = new BigDecimal("3") ;System.out.println(b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP));}
}

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37968.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

科林Linux7_網絡爬蟲

一、爬蟲 網絡資源的下載工具,工作與萬維網環境,持續獲取網頁網站中的網絡信息。可持續的數據采集機器人 1、搜索引擎技術使用爬蟲 2、數據分析、數據挖掘領域,需要爬蟲進行數據準備 3、數據批處理、采集,大量獲取某些網站中的…

LeetCode題練習與總結:二叉樹的前序遍歷--144

一、題目描述 給你二叉樹的根節點 root ,返回它節點值的 前序 遍歷。 示例 1: 輸入:root [1,null,2,3] 輸出:[1,2,3]示例 2: 輸入:root [] 輸出:[]示例 3: 輸入:roo…

數據資產的創新應用與未來展望:探討數據資產在人工智能、物聯網等新興領域的應用前景,提出前瞻性的數據資產解決方案,為企業探索新的增長點,推動行業創新發展

目錄 一、引言 二、數據資產在人工智能領域的應用 1、機器學習與深度學習 2、自然語言處理 3、計算機視覺 三、數據資產在物聯網領域的應用 1、智能家居 2、工業物聯網 3、智慧城市 四、前瞻性的數據資產解決方案 1、構建統一的數據管理平臺 2、加強數據安全和隱私…

webpack源碼解析---addEntry

addEntry EntryPlugin的注冊 webpack會從入口開始解析依賴。 WebpackOptionsApply new WebpackOptionsApply().process(compiler, options); class WebpackOptionsApply {constructor () {}process () {// 注冊 EntryOptionPlugin new EntryOptionPlugin().apply(compiler);}…

基于路徑長度的樣條插補算法(自動駕駛和路徑跟蹤控制適用)

以前在做車輛跟蹤控制的時候發現在針對有多個X和多個Y對應的路徑插補時候,總是報錯,因為MATLAB里面的interp1插補函數它要求x要唯一對應一個y,當路徑以單獨的x或者y來求插補時候的時候就報錯。由于在使用Matlab的interp1函數進行插值時&#…

怎樣才能更好地保護個人賬號的安全

怎樣才能更好地保護個人賬號的安全 保護個人賬號安全是網絡安全的重要組成部分,以下是一些有效的措施來增強賬號的安全性: 1. 使用強密碼 復雜性:創建包含大小寫字母、數字和特殊字符的密碼。長度:密碼至少應有12個字符長。唯一…

談談檢測瀏覽器類型

前幾天被問到如何檢測瀏覽器類型,我突然發現我對此并不了解,之前的項目中也沒有使用到過,只隱約記得通過一個自帶的方法即可獲取。所以今天特意來仔細補習一下。 核心:navigator.userAgent 1.正則表達式 2.引用外部庫 3.判斷瀏…

【Android面試八股文】你知道什么是冷啟動和熱啟動嗎?你知道應用冷啟動的全流程嗎?你知道如何解決啟動時候的黑白屏問題?

文章目錄 一、冷啟動、熱啟動的概念二、冷啟動的流程冷啟動啟動流程:流程細節三、如何解決啟動時候的黑白屏問題?一、冷啟動、熱啟動的概念 在Android開發中,冷啟動和熱啟動是兩個重要的概念,它們描述了應用程序啟動時不同的狀態和表現: 冷啟動(Cold Start): 冷啟動指…

記一次kafka使用不當導致的服務器異常

一、背景 1.運維反饋服務器cpu高&#xff0c;且高達80% 2.經過排查發現kafka出現消息積壓情況 3.使用的是springboot kafka框架 dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency…

Linux-網絡安全私房菜

文章目錄 前言入門基本指令篇章字符集設置cdlsdatemkdirtouch-d-m 修改主機名rmshredrename重命名mv移動tar打包與壓縮打包但是不壓縮打包且壓縮更新包文件解壓對應的包 zip壓縮文件命令cat查看顯示行號交互寫入&#xff08;追加&#xff09;顯示空行 more和lesshead和tailhead…

Android的懸浮時鐘(一)

在Android&#xff0c;如果要懸浮在其他應用上方顯示時鐘或者其他界面的話是需要申請權限的。 首先在manifest中我們就要寫自己要申請的權限SYSTEM_ALERT_WINDOW <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" /> 不同于請求照片或…

期末復習---程序填空

注意&#xff1a; 1.數組后移 *p *(p-1) //把前一個數賦值到后一個數的位置上來覆蓋后一個數 2.指針找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指針指向這個已經找到的最大位置&#xff1b;!!!!!!!!! } p; //因為開始沒有next &#xff…

Web工程化

1、webpack 1.1 概念 一個前端打包器。 webpack 只識別javascript. 所以需要安裝nodejs環境。 1.2 運行環境 Nodejs Nodejs 是運行JavaScript的環境。 因為nodejs發布了許多版本&#xff0c;在不同的技術棧下&#xff0c;需要使用不同的nodejs。 所以需要在電腦上安裝n…

web應用技術-第十一次課后作業

驗證過濾器進行權限驗證的原理。 Filter過濾器&#xff1a;可以把對資源的請求攔截下來&#xff0c;從而實現一些特殊的功能。一般完成登錄校驗、統一編碼處理、敏感字符處理等通用操作。 定義&#xff1a;實現Filter接口 配置&#xff1a;WebFilter(urlPatterns"/*&qu…

常見VPS主機術語有哪些?VPS術語解析

常見VPS主機術語有哪些&#xff1f;本期為大家解析一下我們常見到的聽到的VPS專業術語&#xff0c;幫助大家更輕松的了解VPS主機相關知識。 常見VPS主機術語 Apache – 世界上最流行的 Web 服務器軟件。 CentOS – 旨在提供基于 Red Hat Enterprise Linux 的企業級操作系統的…

mysql 主主HA高可用方案詳解

1.環境準備&#xff1a; 主機&#xff1a;1921.4,1921.5 操作系統&#xff1a;centos 7.3 mysql數據庫版本&#xff1a;mysql 5.7.13 浮動IP:1921.182 2.mysql 下載及解壓安裝配置 2.1 下載&#xff1a; #wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13-linu…

easyexcel 模板填充Excel數據,實現自定義換行及動態調整行高,并保持列表格式一致

pom依賴&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version> </dependency><dependency><groupId>com.alibaba</groupId><artifa…

數據結構-線性表的應用

目錄 前言一、有序表的合并1.1 順序表實現1.2 單鏈表實現 二、稀疏多項式的相加和相乘2.1 稀疏多項式的相加2.2 稀疏多項式的相乘 總結 前言 本篇文章介紹線性表的應用&#xff0c;分別使用順序表和單鏈表實現有序表的合并&#xff0c;最后介紹如何使用單鏈表實現兩個稀疏多項…

基于springboot+vue+uniapp的超市售貨管理平臺

開發語言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

考研生活day2--王道課后習題2.3.1、2.3.2、2.3.3

2.3.1 題目描述&#xff1a; 這題和曾經做過的LeetCode203.移除元素一模一樣&#xff0c;所以我們就使用LeetCode進行書寫&#xff0c;題目鏈接203. 移除鏈表元素 - 力扣&#xff08;LeetCode&#xff09; 解題思路 大家的第一反應肯定是根據書上所學的書寫方法一樣書寫&…