String轉(zhuǎn)double失去精度問(wèn)題及解決
String轉(zhuǎn)double失去精度問(wèn)題
最近遇到一個(gè)坑,19.9的字符串轉(zhuǎn)double變成19.89,坑死我了。
現(xiàn)在把更改后的代碼貼出來(lái)
String s = "19.9"; BigDecimal temp = BigDecimal.valueOf(Double.valueOf(s)); // 將temp乘以100 temp = temp.multiply(BigDecimal.valueOf(100)); int sum = temp.intValue(); System.out.println(sum);
這樣親測(cè)不會(huì)失去精度。最后說(shuō)一句,細(xì)節(jié)很重要,特別是字符串轉(zhuǎn)其他類型的時(shí)候。
Java精度丟失之String轉(zhuǎn)Double轉(zhuǎn)int
項(xiàng)目遇到一種需求
服務(wù)器返回我“0.850”,我需要顯示八五折
看起來(lái)很簡(jiǎn)單,于是代碼出來(lái)了:
?Double d = Double.parseDouble("0.850"); ?int result = (int) (d*100);
隨便找了兩個(gè)數(shù)試了試都沒(méi)問(wèn)題就以為大功告成了,誰(shuí)知道測(cè)試的同事告訴我0.570顯示的是56而不是57,我抱著懷疑的態(tài)度驗(yàn)證了一下,的確是我錯(cuò)了!
我心里一驚,是不是還有其他的特殊數(shù)字也會(huì)出現(xiàn)這種詭異的現(xiàn)象呢?
?public static void main(String[] args) { ? ? ? ? for(int i=0;i<10;i++){ ? ? ? ? ? ? for (int j=0;j<10;j++){ ? ? ? ? ? ? ? ? for(int k=0;k<10;k++){ ? ? ? ? ? ? ? ? ? ? getUnNormalNumber(i,j,k); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? private static ?void getUnNormalNumber(int i,int j,int k){ ? ? ? ? String test = "0." + i + j + k; ? ? ? ? Double d = Double.parseDouble(test); ? ? ? ? int result = (int) (d*100); ? ? ? ? if(result/10==i&&result%10==j){ ? ? ? ? }else { ? ? ? ? ? ? System.out.println(test); ? ? ? ? } ? ? }
經(jīng)過(guò)驗(yàn)證,果然有三個(gè)數(shù)是特殊的數(shù)字!
0.290
0.570
0.580
解決辦法
private static String getSuitableString(String test) { ? ? ? ? String array[] = test.split("\\."); ? ? ? ? if(array[1]==null) { return ""; } ? ? ? ? char[] chars = array[1].toCharArray(); ? ? ? ? if (chars.length>=2){ ? ? ? ? ? ? return chars[0]+""+chars[1]; ? ? ? ? }else { ? ? ? ? ? ? return ?chars[0]+""; ? ? ? ? } ? ? }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot集成canal實(shí)現(xiàn)示例解析
這篇文章主要為大家介紹了springboot整合canal的示例實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多多進(jìn)步,早日升職加薪2022-02-02SpringBoot+Shiro+LayUI權(quán)限管理系統(tǒng)項(xiàng)目源碼
本項(xiàng)目旨在打造一個(gè)基于RBAC架構(gòu)模式的通用的、并不復(fù)雜但易用的權(quán)限管理系統(tǒng),通過(guò)SpringBoot+Shiro+LayUI權(quán)限管理系統(tǒng)項(xiàng)目可以更好的幫助我們掌握springboot知識(shí)點(diǎn),感興趣的朋友一起看看吧2021-04-04java并發(fā)訪問(wèn)重復(fù)請(qǐng)求過(guò)濾問(wèn)題
本篇文章給大家分享了關(guān)于java并發(fā)訪問(wèn)重復(fù)請(qǐng)求過(guò)濾的相關(guān)問(wèn)題以及解決方法,對(duì)此有需要的朋友參考學(xué)習(xí)下。2018-05-05Java序列化JSON丟失精度問(wèn)題的解決方法(修復(fù)Long類型太長(zhǎng))
這篇文章主要給大家介紹了關(guān)于Java序列化JSON丟失精度問(wèn)題的解決方法,修復(fù)Long類型太長(zhǎng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03StreamAPI多次消費(fèi)一個(gè)stream代碼實(shí)例
這篇文章主要介紹了StreamAPI多次消費(fèi)一個(gè)stream代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java 根據(jù)貸款年限對(duì)應(yīng)利率計(jì)算功能實(shí)現(xiàn)解析
這篇文章主要介紹了Java 根據(jù)貸款年限對(duì)應(yīng)利率計(jì)算功能實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10兩個(gè)小例子輕松搞懂 java 中遞歸與尾遞歸的優(yōu)化操作
這篇文章主要介紹了兩個(gè)小例子輕松搞懂 java 中遞歸與尾遞歸的優(yōu)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Spring Hibernate實(shí)現(xiàn)分頁(yè)功能
這篇文章主要為大家詳細(xì)介紹了Spring Hibernate實(shí)現(xiàn)分頁(yè)功能的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05