1. 程式人生 > >BigDecimal使用心得(一)

BigDecimal使用心得(一)

看圖


如圖
讀過effective java的都知道,其中第49條就是:如果需要精確的答案,請避免使用float和double

所以在涉及到貨幣計算的時候一般使用BigDecimal

分析

但是BigDecimal也要講究使用方法,否則也可能事與願違,沒有獲得你想要的效果。

BigDecimal.valueof(0.99),可以看一下此方法的具體實現:


可以看到此方法先將引數轉成了string型別,然後在執行引數為String型別的BigDecimal的建構函式。這樣的結果一般就是我們想要的。
所以在使用BigDecimal的時候,要麼使用newBigDecimal(String value),要麼使用BigDecimal.valueof(doublevalue)。

那如果引數為float型別的,比如BigDecimal.valueOf(0.99f)的值是多少呢?
首先此函式會自動進行精度擴充套件,將float型別的0.99轉成double型別的,因為0.99本身就是無法用二進位制表示的,也就說無論你的精度是多少位,都無法用二進位制來精確表示0.99,或者你用二乘來判斷(0.99*2=1.98 0.98*2=1.960.96*2=1.92 。。。永遠無法得到一個整數)。這就是二進位制計算機的缺點,就如同十進位制也也無法表示1/3,1/6一樣。
所以在0.99f轉成double時,進行了精度擴充套件,變成了0.9900000095367432,而接著轉成字串,最後轉成BigDecimal.


輸出結果如下:

至於為什麼是這個數,那就涉及到二進位制的補碼移碼的問題,double型別的0.99在計算機中的儲存形式。這裡你只要記得它絕不是你想要的精確的0.99即可。也為精確計算埋下了隱患。

jdk中已經明確不建議使用new BigDecimal(double value)這種形式的建構函式,這是為什麼呢???
仍然是因為double型別不夠精確,

輸出結果:


總結:

總之,在涉及到精確計算的時候,使用浮點型的資料很可能會出現你意想不到的結果。即使在使用BigDecimal的時候,也應該使用new BigDecimal(Stringvalue) 或 BigDecimal.valueof( double

 value)

相關推薦

BigDecimal使用心得

看圖 如圖讀過effective java的都知道,其中第49條就是:如果需要精確的答案,請避免使用float和double 所以在涉及到貨幣計算的時候一般使用BigDecimal 分析 但是BigDecimal也要講究使用方法,否則也可能事與願違,沒有獲得你想要的

關於spring源碼的一些心得

blog clas 實現接口 繼承 classpath mage 獲取 ssp 源碼 總結:通過前面的一些認識,可以大致認為,ioc容器就是獲取一些需要使用的對象如pojo等的引用,相當於new 而ioc容器的作用也就是用於此處,用於獲取或者讀取對象實例

C++學習心得

eof gpo pre typeid 學習 div ctrl+z c++ str 2018-01-20 while (cin >> n)//終止可以使用輸入eof或Ctrl+Z for (auto &c : str) cout <

Android學習心得

1、活動類處理啟動與關閉活動的相關方法及說明 方法 說明 StartActivity(intent) 使用引數意圖啟動新活動,此方法是重寫Context類實現的原始版本 startA

Java開發學習心得:SSM環境搭建

Java開發學習心得(一):SSM環境搭建 有一點.NET的開發基礎,在學校學過基礎語法,對JAVA有點興趣,就簡單學習了一下,記錄一下從哪些方面入手的,暫時不打算深入到原理方面,先簡單搭下環境看看,所以有些地方可能講得不慎準確。 1 SSM框架 從網上的討論來看,SSM框架似乎正在慢慢被Spring

STM32 使用Cube的心得

最近做了一個專案使用Cube自動生成程式碼,然後利用HAL庫進行程式設計。晶片為STM32F103C8T6進行程式設計。 I2C讀寫 1. 地址需要自己左移1位(stm32中需要,但是NXP中不需要),LPC系列的以前用過一款,函式內部自動左移了。 2. SCL,SDA通訊時需要接上拉電阻,然

項目管理學習心得

項目 隨著 集成 重要 前言 class 特定 實體 軟件項目管理 前言不序,往事不憶,直奔主題。 項目管理一般有十個主要管理內容:範圍管理、時間管理、成本管理、質量管理、集成管理、風險管理、溝通管理、組織管理、人力資源管理和采購管理。 在學習各個內容之前,需要先知道什麽是

專案管理學習心得

前言不序,往事不憶,直奔主題。 專案管理一般有十個主要管理內容:範圍管理、時間管理、成本管理、質量管理、整合管理、風險管理、溝通管理、組織管理、人力資源管理和採購管理。 在學習各個內容之前,需要先知道什麼是專案?什麼是專案管理? 專案是一次性的、臨時性的活動,即是在明確的有限時間內進行的工作和活動,也許

Android開發心得

Android開發心得之MVC 這一個學期在上潘老師的系統設計與分析課程時,我們小組開發了基於安卓平臺的電影購票軟體。在開發過程中收穫了挺多,現在在課程結束前,把其分享出來。 MVC是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控

Android重新學習記錄和心得--Handler

1.關於Handler,MessageQueue,Looper,Message 主要講了Handler的message傳送,訊息的同步非同步。以前只知道Handler可以傳送訊息,然後一般通過handlerMessage方法來接收各種訊息,發現其實Handler還可設定

Python for Data Analysis 學習心得

一、簡介 Python for Data Analysis這本書的特點是將numpy和pandas這兩個工具介紹的很詳細,這兩個工具是使用Python做資料分析非常重要的一環,numpy主要是做矩陣的運算,pandas主要是做資料的預處理,另外本書還教了其他資料分析相關的工具,比如matplotlib用來作

SpringCloud學習心得 構建最基礎的SpringCloud專案

首先本系列部落格參照 史上最簡單的 SpringCloud 教程,地址:https://blog.csdn.net/forezp/article/details/70148833根據工作需要,筆者最近研究SpringCloud微服務框架,將最近的學習過程寫下來供大家參考。好,

Objective C 學習心得 :--Windows下搭建objective C開發環境

      最近打算針對iPhone、iPod touch和iPad開發一些應用,所以,需要開始學習Objective C(蘋果推出的類似C語言的開發語言)。由於蘋果的自我封閉的產業鏈發展模式(從晶片、機器、開發語言、終端產品、服務)的限制,要想開發針對蘋果iPhone等產品

STM32串列埠使用心得——DMA+空閒中斷接收

一,因何用之? 之前曾經寫過一篇《關於CubeMX的串列埠全雙工接收發送鎖死的問題》的文章,討論了STM32的串列埠在全雙工模式下會出現鎖死問題的現象。當時的解決辦法是在串列埠接收中斷中加入解鎖機制,貌似臨時解決了這個問題。但這幾天程式不知道怎麼回事,又開

Java專案開發心得:利用Java技術實現查詢手機號碼歸屬地

      鑑於最近專案涉及到查詢歸屬地的問題,今天在此做一下技術分享,如果有更好的建議,還請讀者大神指出。       迴歸正題,關於手機號碼歸屬地,想要查詢的無非是執行商、省份、市之類的資

qrencode二維碼生成庫函式使用心得付測試原始碼

開發環境: Linux平臺:虛擬機器下ubuntu 14.04 交叉編譯工具:gcc-4.4.3 arm開發板:mini2440 arm 核心版本:linux-3.4.99 最近公司的專案需要在展訊功能機平臺下實現字串生成二維碼功能,在網上搜了下,有個linux平臺下的開

VS2017的C++開發心得VS的專案建立

從2017開始VisualStudio開放了免費版本2017community版本,也不用再絞盡腦汁去破解這款神一般的IDE,直接去官網下載安裝即可。安裝元件如下: 工作負載中只選擇C++的桌面開發就行,不需要的會很佔硬碟而且是很多的C盤硬碟,以後有需要可以隨時增加。

遊戲製作心得

談了很多關於網路遊戲的一些技術技巧和框架,但都是零散的,這有好處,但大多數新手或是愛好者都不知道該如何下手,下面談談我的遊戲開發心得 遊戲開發一般使用VC+DX,你可以使用Win32 API直接建立一個Windows應用程式框架,也可以使用MFC來建立一個Windows應用

爬蟲學習心得

學習是件苦差事。 機器人只不過本質上是一個巨集,它旨在檢索一個或多個web頁面並提取相關資訊。 爬蟲是一個專業的機器人,目的是在其他的網站找到自己需要的資訊。 蜘蛛的另一個常見用途是網站對映。 人工智慧機器更能適應使用者的需要。 如果一個程式被設計去檢索一個特定的銀行賬戶,

pygame遊戲程式設計心得——轉向行為(目標追蹤)

 最近自學python語言的過程中接觸到了Pygame,這也是我第一次接觸到遊戲引擎。作為一個男生對遊戲有天然的興趣,所以當看到pygame時自己做個小遊戲的想法便油然而生,在這個過程中遇到了很多問題。基於學習和討論的基於學習和討論的目的寫了這個文章。 遇到的問題:怎麼實