開發技術-Java BigDecimal 精度丟失問題

文章目錄

    • 1. 背景
    • 2. 方法
    • 3. 總結

1. 背景

昨天和小伙伴排查一個問題時,發現一個 BigDecimal 精度丟失的問題,即

        double a = 1.1;BigDecimal ba = new BigDecimal(a).subtract(new BigDecimal(0.1));System.out.println(ba);

輸出:

1.0000000000000000832667268468867405317723751068115234375

隨后測試了其他類型轉為 BigDecimal 后參與計算的效果。

        int c = 1;BigDecimal cb = new BigDecimal(c).subtract(new BigDecimal(0.1));System.out.println("int---" + cb);Integer ci = 1;BigDecimal cbi = new BigDecimal(ci).subtract(new BigDecimal(0.1));System.out.println("Integer---" + cbi);float a = 1.1f;BigDecimal fb = new BigDecimal(a).subtract(new BigDecimal(0.1));System.out.println("float---" + fb);Float fa = 1.1F;BigDecimal fba = new BigDecimal(fa).subtract(new BigDecimal(0.1));System.out.println("Float---" + fba);double b = 1.1d;BigDecimal bb = new BigDecimal(b).subtract(new BigDecimal(0.1));System.out.println("double---" + bb);Double db = 1.1D;BigDecimal dbb = new BigDecimal(db).subtract(new BigDecimal(0.1));System.out.println("Double---" + dbb);String str = "1.1";BigDecimal sb = new BigDecimal(str).subtract(new BigDecimal(0.1));System.out.println("String---" + sb);BigDecimal bd = new BigDecimal("1.1").subtract(new BigDecimal(0.1));System.out.println("BigDecimal---" + bd);

輸出:

Integer---0.8999999999999999944488848768742172978818416595458984375
float---1.0000000238418579046051348768742172978818416595458984375
Float---1.0000000238418579046051348768742172978818416595458984375
double---1.0000000000000000832667268468867405317723751068115234375
Double---1.0000000000000000832667268468867405317723751068115234375
String---0.9999999999999999944488848768742172978818416595458984375
BigDecimal---0.9999999999999999944488848768742172978818416595458984375

效果都是不行的。

2. 方法

以下幾種方式都可以:

        BigDecimal bd2 = new BigDecimal(String.valueOf("1.1")).subtract(new BigDecimal("0.1"));System.out.println("String.valueOf---" + bd2);BigDecimal bd3 = new BigDecimal(Double.toString(1.1d)).subtract(new BigDecimal("0.1"));System.out.println("Double.toString---" + bd3);BigDecimal bv = BigDecimal.valueOf(1.1d).subtract(BigDecimal.valueOf(0.1));System.out.println("BigDecimal.valueOf---" + bv);

輸出:

String.valueOf---1.0
Double.toString---1.0
BigDecimal.valueOf---1.0

需要注意的是,new BigDecimal(str) 會有問題,

new BigDecimal(String.valueOf(str)) 卻不會。

3. 總結

推薦使用

new BigDecimal(String.valueOf("1.1"))
new BigDecimal(Double.toString(1.1d))
BigDecimal.valueOf(1.1d)

在這里插入圖片描述
(圖網,侵刪)

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

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

相關文章

構建自定義Tensorflow鏡像時用到的鏈接地址整理

NVIDIA相關: NVIDIA CUDA鏡像的docker hub:https://hub.docker.com/r/nvidia/cuda/tags?page&page_size&ordering&name12.4.1NVIDIA 構建的Tensorflow鏡像包:https://docs.nvidia.com/deeplearning/frameworks/tensorflow-rele…

項目屬性的精粹:Gradle中配置項目屬性的全面指南

項目屬性的精粹:Gradle中配置項目屬性的全面指南 在構建自動化的宏偉藍圖中,Gradle以其靈活的項目屬性配置脫穎而出。項目屬性是構建過程中可配置的參數,它們可以控制構建行為、定義條件邏輯,甚至影響依賴解析。本文將深入探討如…

Vue3 使用 Vue Router 時,prams 傳參失效和報錯問題

Discarded invalid param(s) “id“, “name“, “age“ when navigating 我嘗試使用 prams 傳遞數據 <script setup> import { useRouter } from vue-routerconst router useRouter() const params { id: 1, name: ly, phone: 13246566476, age: 23 } const toDetail…

快速使用BRTR公式出具的大模型Prompt提示語

Role:文章模仿大師 Background: 你是一位文章模仿大師&#xff0c;擅長分析文章風格并進行模仿創作。老板常讓你學習他人文章后進行模仿創作。 Attention: 請專注在文章模仿任務上&#xff0c;提供高質量的輸出。 Profile: Author: 一博Version: 1.0Language: 中文Descri…

半邊數據結構學習

半邊數據結構學習 一、網格數據結構二、半邊數據結構頂點(Vertex)半邊(HalfEdge)面片(Face) 三、OpenMesh 相關代碼拓撲關聯對象遍歷 四、OpenFilpper 相關代碼HoleInfo類孔洞檢測孔洞信息HoleFiller類孔洞補全 一、網格數據結構 對于表面網絡來說&#xff0c;其關鍵在于拓撲&…

【MySQL系列】VARCHAR的底層存儲

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

python-親和數(賽氪OJ)

[題目描述] 古希臘數學家畢達哥拉斯在自然數研究中發現&#xff0c;220 的所有真約數(即不是自身的約數)之和為&#xff1a; 1245101120224455110&#xff1d;284 。 而 284 的所有真約為 1 、 2 、 4 、 71 、 142 &#xff0c;加起來恰好為 220 。人們對這樣的數感到很驚奇&a…

頤養優選元宇宙

頤養優選是一個專注于為中老年人提供高品質養老服務的品牌或平臺。它通常涵蓋了一系列服務和產品&#xff0c;旨在幫助老年人享受健康、舒適、有尊嚴的晚年生活。這些服務可能包括但不限于以下幾個方面&#xff1a; ###健康管理 -**定期體檢**&#xff1a;提供定期的身體健康檢…

如何搞定美國TikTok直播網絡?

在全球范圍內&#xff0c;TikTok已經積累了超過30億次的下載量&#xff0c;月活躍用戶達到13億以上&#xff0c;支持75種語言&#xff0c;覆蓋了150多個國家和地區。這一龐大的流量池吸引了眾多國內電商人嘗試在TikTok上進行業務拓展。本文將探討如果要在美國運營TikTok直播&am…

ruoyi定時任務使用

使用沒有什么特別的&#xff0c;不再贅述&#xff0c;可參見前端文檔 或下面的文章 ruoyi若依定時任務的基本使用_若依框架定時任務怎么用-CSDN博客 只說一下被調度任務的建立 1、在調用的類上添加Component("后期在調用任務創建用的偽類的名稱") 稱為偽類是因為…

MySql性能調優03-[SQL優化]

SQL優化 MySQL優化SQL優化-不要寫select *SQL優化-小表驅動大表&#xff0c;而不是大表驅動小表SQL優化-連接查詢代替子查詢SQL優化-提升group by的效率SQL優化-使用limitSQL優化-union all代替unionSQL優化-join的表不宜過多 MySQL優化 trace工具 set session optimizer_trac…

把Docker的虛擬磁盤文件移動到別的盤符

今天清理C盤空間&#xff0c;發現一個很大的文件 ext4.vhdx 足有 15G 之多&#xff0c;發現這個是Docker的虛擬磁盤文件&#xff0c;于是在網上找到移到它的辦法&#xff0c;使用 PowerShell 執行下面命令 查看Docker狀態和版本 wsl -l -v 關閉Docker服務 wsl --shutdown …

Kithara與OpenCV (一)

Kithara使用 OpenCV 庫 目錄 Kithara使用 OpenCV 庫簡介需求和支持的環境構建 OpenCV 庫使用 CMake 進行配置以與 Kithara 一起工作 使用 OpenCV 庫設置項目運行 OpenCV 代碼圖像采集和 OpenCV自動并行化限制和局限性1.系統建議2.實時限制3.不支持的功能和缺失的功能4.顯示 Ope…

Python 數據類型與基礎概念

在 Python 編程中&#xff0c;理解和掌握數據類型和基礎概念是至關重要的。這些概念不僅幫助我們更有效地編寫代碼&#xff0c;還使我們能夠創建更加復雜和功能豐富的應用程序。本文將詳細介紹 Python 中的基本數據類型及其相關操作&#xff0c;并涵蓋一些重要的基礎概念。 1.…

數字化打造行業生態產業鏈,企業新增益全知道

在當今數字化時代&#xff0c;利用數字化打造行業生態產業鏈成為企業發展的重要戰略選擇。那么&#xff0c;這一舉措究竟能為企業帶來哪些新增益呢&#xff1f;讓我們一探究竟。 一、運營效率大幅提高 數字化技術就像一條神奇的紐帶&#xff0c;將產業鏈上的各個環節緊緊相…

Python函數 之 匿名函數

1.概念 匿名函數: 使用 lambda 關鍵字 定義的表達式&#xff0c;稱為匿名函數. 2.語法 lambda 參數, 參數: 一行代碼 # 只能實現簡單的功能&#xff0c;只能寫一行代碼 # 匿名函數 一般不直接調用&#xff0c;作為函數的參數使用的 3.代碼 4.練習 # 1, 定義匿名函數, 參數…

32路串口服務器 應用領域

32路串口服務器在多個領域有著廣泛的應用&#xff0c;以下是詳細的應用實例&#xff1a; 一、工業自動化 在工業自動化領域&#xff0c;32路串口服務器發揮著舉足輕重的作用。傳統的工業設備往往采用串口通信方式&#xff0c;而串口服務器能夠將這些設備接入網絡&#xff0c;…

C++ 開源庫

1 PDFium PDFium 是一個開源的 PDF 渲染和處理庫&#xff0c;最初由 Foxit Software 開發&#xff0c;并于2014年捐贈給了 Chromium 項目。PDFium 旨在為各種應用程序提供高效、靈活的 PDF 渲染和操作功能。 2 代碼地址 https://github.com/chromium/pdfium 主要特性 渲染…

集訓 Day 3 總結 虛樹 + dfs tree + 基環樹

虛樹 虛樹&#xff0c;顧名思義是 只關注原樹上的某些 關鍵點&#xff0c;在保留原樹祖孫關系的前提下建出的一棵邊數、點數大大減少的樹 適用于優化某些在整棵樹上進行 d p dp dp、 d f s dfs dfs 的問題 通常是題目中出現多次詢問&#xff0c;每次給出樹上的一些關鍵點&a…

11網絡層-分組轉發算法

路由 分組轉發 1&#xff09;從數據報的首部提取目的主機的IP地址D&#xff0c;得出目的網絡地址N 2&#xff09;若N就是與此路由器直接相連的某個網絡地址&#xff0c;則進行直接交付&#xff0c;不需要經過其他路由器&#xff0c;直接將數據報交付給目的主機&#xff08;這…