double operator[](int i)_java中double類型精度丟失問題及解決方法

原文鏈接:https://blog.csdn.net/yacolspace/article/details/78287394

double類型數據加減操作精度丟失問題

今天在項目中用到double類型數據加減運算時,遇到了一個奇怪的問題,比如1+20.2+300.03,理論上結果應該是321.23,其實結果并不是這樣。

public?double?add()?{????????double?number1 =?1;????????double?number2 =?20.2;????????double?number3 =?300.03;????????double?result = number1 + number2 + number3;????????System.out.println(result);????????return?result;????}

打印結果如下:

c19adee540a7680cb1f979fe55999ca0.png

這是為什么呢?又該如何解決呢?

在使用Java中double 進行運算時,經常出現精度丟失的問題,總是在一個正確的結果左右偏0.0000**1。float和double只能用來做科學計算或者是工程計算,在商業計算中我們要用 java.math.BigDecimal。BigDecimal一共有4個夠造方法,我們只考慮兩個進行比較,分別是

BigDecimal(double?val)??????????Translates a?double?into?a BigDecimal.BigDecimal(String val)??????????Translates the String repre sentation of a BigDecimal?into?a BigDecimal.

上面的API簡要描述相當的明確,而且通常情況下,上面的那一個使用起來要方便一些。我們可能想都不想就用上了,會有什么問題呢?

現貼出BigDecimal的一個構造函數的文檔供大家參考

23c4daa808191894ffc0c41e1f4ac724.png

解決方法

相信從上面的文檔大家也已經找出了解決方法,在需要精確的表示兩位小數時我們需要把他們轉換為BigDecimal對象,然后再進行運算。

另外需要注意,使用BigDecimal(double val)構造函數時仍會存在精度丟失問題,建議使用BigDecimal(String val)。這就需要先把double轉換為字符串然后在作為BigDecimal(String val)構造函數的參數。轉換為BigDecimal對象之后再進行加減乘除操作,這樣精度就不會出現問題了。這也是為什么有關金錢數據存儲都使用BigDecimal。

處理double類型數據的加、減、乘、除運算時,使用如下方法:

/**?????* 加法運算?????*?@param?m1?????*?@param?m2?????*?@return?????*/????public?static?double?addDouble(double?m1,?double?m2)?{????????BigDecimal p1 =?new?BigDecimal(Double.toString(m1));????????BigDecimal p2 =?new?BigDecimal(Double.toString(m2));????????return?p1.add(p2).doubleValue();????}????/**?????* 減法運算?????*?@param?m1?????*?@param?m2?????*?@return?????*/????public?static?double?subDouble(double?m1,?double?m2)?{????????BigDecimal p1 =?new?BigDecimal(Double.toString(m1));????????BigDecimal p2 =?new?BigDecimal(Double.toString(m2));????????return?p1.subtract(p2).doubleValue();????}????/**?????* 乘法運算?????*?@param?m1?????*?@param?m2?????*?@return?????*/????public?static?double?mul(double?m1,?double?m2)?{????????BigDecimal p1 =?new?BigDecimal(Double.toString(m1));????????BigDecimal p2 =?new?BigDecimal(Double.toString(m2));????????return?p1.multiply(p2).doubleValue();????}????/**?????* 除法運算?????*?@param???m1?????*?@param???m2?????*?@param???scale?????*?@return?????*/????public?static?double?div(double?m1,?double?m2,?int?scale)?{????????if?(scale 

驗證文章開頭提到的問題是否解決,

public?double?addDouble()?{????????double?result1 =?add(1,?20.2);????????double?result2 =?add(result1,?300.03);????????System.out.println("使用BigDecimal時結果值:"?+ result2);????????return?result2;????}

打印結果值

e32b10fa68675c8d0dcb3e529fdf1970.png

跟預想中的結果值一樣,解決了double類型數據加減操作時精度丟失的問題。

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

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

相關文章

驗證客戶端和服務端可以傳輸經SM4加密的密文數據,從而驗證發送數據已使用服務器密碼機進行SM4加密,而不是隨便的字符串亂碼

前提操作 搭建客戶端和服務端 Socket代碼實現服務端 和 客戶端之間通信_CHYabc123456hh的博客-CSDN博客使用wireshark進行數據的監聽和測試https://blog.csdn.net/CHYabc123456hh/article/details/121929288 結論驗證 使用在線SM4加密,輸入明文 和 選擇模式,生成…

Socket編程 涵蓋代碼和函數參數介紹

Socket是針對端系統,也就是用戶主機上開發程序,不涉及網絡設備(交換機、路由器)獨立于網卡驅動層之上,不涉及硬件,即基于Packet Driver編程端:是指通信雙方兩臺電腦 應用編程接口API 也就是兩端 應用層內部的應用進程之…

springcloud阿里巴巴五大組件_如何無縫遷移 SpringCloud/Dubbo 應用到 Serverless 架構

簡介: 本文分為三部分來介紹,分別介紹微服務應用遷移到 SAE 的優勢,如何遷移 SpringCloud/Dubbo 應用到 SAE 上,以及針對 SpringCloud 應用遷移的實踐演示。背景通過前面幾節課程的學習,相信大家對于 SAE 平臺已經有了…

pythonnone用法_python中None返回值如何使用?

None是python中的特殊存在。作為函數,在用到返回值的經常使用。今天小編就來講講None作為函數返回值時,會出現的三種情況。 一、作為操作類函數的默認返回值 當某個操作類函數不需要任何返回值時,通常就會返回 None。同時,None 也…

C++ Byte轉十六進制字符串輸出

代碼 例子一 typedef std::vector<unsigned char> bytes; std::string BytesToStr(const bytes& in) {bytes::const_iterator from in.cbegin();bytes::const_iterator to in.cend();std::ostringstream oss;for (; from ! to; from)oss << std::hex <&…

frame中src怎么設置成一個變量_Go 語言設計哲學之七:變量聲明須一致

Go 語言&#xff0c;使用變量之前需要先進行變量的聲明。var s string “Golang"n : 666Go 語言有兩類變量包級別(package varible)&#xff1a;在 package 級別可見的變量。如果是導出變量&#xff0c;該變量也可以被視為全局變量&#xff1b;局部變量(local varible)&a…

數據填充規則之PKCS7

程序輸入的數據全部使用Hex 十六進制的格式 IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data 303030303030303030303030303030CC CC表示此位無數據注意事項&#xff1a;考慮到程序采用 PKCS…

getdevicecaps在哪個頭文件里_一招定勝負,while (true) 和 for (;;) 到底哪個更快

在JDK8u的jdk項目下做個很粗略的搜索&#xff1a;mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . | wc -l 369mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "while (true" . | wc -l 323并沒有差多少。其次&#…

SM4 ECB加密模式 數據對比試驗論證

程序如下 開啟服務器密碼機&#xff0c;調用SM4加密函數&#xff0c;需要注意的是程序輸入的數據全部使用Hex 十六進制的格式 Key IV Data IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data …

二分法查找c語言程序_C語言的那些經典程序 第十四期

戳“在看”一起來充電吧!C語言的那些經典程序 第十四期本期小C給大家帶來三個用C語言解決實際問題的典例。如果全都理解&#xff0c;相信肯定能給大家帶來收獲&#xff01;接下來讓我們看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;運行結果&#xff1a;程序分析:該…

C++ puts函數 打印字符串很方便

參考鏈接 c puts函數_在C / C 中使用puts&#xff08;&#xff09;函數_從零開始的教程世界-CSDN博客

centos網絡隔一段時間就斷_計算機網絡總結

POST跟GET的區別作用GET用于獲取資源&#xff0c;而POST用于傳輸實體參數GET的參數以字符串的格式出現在URL中&#xff0c;而POST的參數存儲在請求實體中。因為URL只支持ASCII碼&#xff0c;故GET的參數如果存在中文等字符就需要先進行編碼&#xff0c;POST參考支持標準字符集。…

C++/C++11中std::runtime_error的使用

參考鏈接 C/C11中std::runtime_error的使用_網絡資源是無限的-CSDN博客_runtimeerror

有python基礎學java_Python基礎學習篇

導讀Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum于1989年底發明&#xff0c;第一個公開發行版發行于1991年。像Perl語言一樣, Python 源代碼同樣遵循 GPL(GNU General Public License)協議。一. 列表1.1 列表的介紹列表是python的…

使用wireshark抓包,本地環回測試通信數據已經通過SM4國密算法加密

具體操作 本實驗采用 本地環回測試開啟wireshark抓包工具&#xff0c;設定端口號 tcp.port 5099 &#xff08;5099為服務端對外開啟服務的端口號&#xff09;&#xff0c;不可以使用ip.addr指定ip地址&#xff0c;因為本地環回測試&#xff0c;相關信息太多&#xff0c;使用端…

public 函數_UE4精品教程 | 渲染編程(C++篇)【第三卷:從仿函數到std::function再到虛幻4Delegate】...

本文轉載于YivanLee知乎作者專題目錄鏈接&#xff1a;https://zhuanlan.zhihu.com/p/67694999這幾天研究了一下虛幻4的delegate&#xff0c;但是想要理解這個&#xff0c;還得從仿函數說起。下面是一段代碼例子&#xff1a;class MyFunctor{ public: int operator()(int …

C語言深度剖析書籍學習記錄 第一章 關鍵字

C語言標準定義了32個關鍵字 union聲明聯合數據類型 Union declaration - cppreference.com維護足夠的空間來置放多個數據成員中的“一種”&#xff0c;而不是為每一個數據成員配置空間&#xff0c;在 union 中所有的數據成員共用一個空間&#xff0c;同一時間只能儲存其中一個…

js頁面自適應屏幕大小_移動端自適應布局方法的calc()與vw

前端人員在處理移動端自適應布局時&#xff0c;目前前端最流行的方法應該就是使用媒體查詢&#xff0c;來設置HTML的字體大小&#xff0c;然后用rem為單位對Dom的寬高進行設置&#xff0c;這個方法的優勢在于兼容性方面很好&#xff0c;劣勢則在于當前市場上不同的機型太多&…

C語言深度剖析書籍學習記錄 第二章 符號

\ 連接符號&#xff0c;// \ 可以把下一行也注釋調編譯器 刪除注釋時&#xff0c;會使用空格進行替代