Java用BigDecimal解決double類型相減時可能存在的誤差
double類型的兩個數(shù)相減可能存在誤差,比如System.out.println(2099 - 1999.9);的結(jié)果為99.09999999999991
可以用BigDecimal解決:
public class TestDouble { //兩個Double數(shù)相減 public static Double sub(Double d1, Double d2) { if (d1 == null || d2 == null) { return null; } BigDecimal b1 = new BigDecimal(d1.toString()); BigDecimal b2 = new BigDecimal(d2.toString()); return b1.subtract(b2).doubleValue(); } //兩個Double數(shù)相加 public static Double add(Double d1, Double d2) { if (d1 == null || d2 == null) { return null; } BigDecimal b1 = new BigDecimal(d1.toString()); BigDecimal b2 = new BigDecimal(d2.toString()); return b1.add(b2).doubleValue(); } //兩個Double數(shù)相除,并保留scale位小數(shù) public static Double div(Double d1, Double d2, int scale) { if (d1 == null || d2 == null || scale < 0) { return null; } BigDecimal b1 = new BigDecimal(d1.toString()); BigDecimal b2 = new BigDecimal(d2.toString()); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } // 兩個Double數(shù)相乘 public static Double mul(Double d1, Double d2) { if (d1 == null || d2 == null) { return null; } BigDecimal b1 = new BigDecimal(d1.toString()); BigDecimal b2 = new BigDecimal(d2.toString()); return b1.multiply(b2).doubleValue(); } /** * 遇到.5的情況時往上近似 * * @param d * @param scale * @return */ public static Double setDoubleScale(Double d, int scale) { if (d == null || scale < 0) { return null; } BigDecimal b = new BigDecimal(d); return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } public static void main(String[] args) { Double d1 = 2099d; Double d2 = 1999.999; System.out.println(d1 - d2); System.out.println(sub(d1, d2)); System.out.println("------------------------------------"); System.out.println(d1 * d2); System.out.println(mul(d1, d2)); System.out.println("------------------------------------"); System.out.println(d1/d2); System.out.println(div(d1,d2,4)); } }
結(jié)果:
99.00099999999998
99.001
------------------------------------
4197997.901
4197997.901
------------------------------------
1.0495005247502625
1.0495
到此這篇關(guān)于Java用BigDecimal解決double類型相減時可能存在的誤差的文章就介紹到這了,更多相關(guān)Java double相減誤差內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot創(chuàng)建的web項目整合Quartz框架的項目實踐
本文主要介紹了springboot創(chuàng)建的web項目整合Quartz框架的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Idea進(jìn)行pull的時候Your local changes would be
這篇文章主要介紹了Idea進(jìn)行pull的時候Your local changes would be overwritten by merge.具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11解決lambda表達(dá)式內(nèi)出現(xiàn)異常無法throw拋出的問題
這篇文章主要介紹了lambda表達(dá)式內(nèi)出現(xiàn)異常無法throw拋出的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java動態(tài)初始化數(shù)組,元素默認(rèn)值規(guī)則詳解
動態(tài)初始化數(shù)組涉及先定義數(shù)組長度,后填充具體數(shù)據(jù),適用于數(shù)據(jù)量已知但具體值未定的情況,這種初始化方式允許程序運行過程中賦值,并會根據(jù)數(shù)據(jù)類型設(shè)定默認(rèn)值,如整型為0,字符串為null,動態(tài)初始化與靜態(tài)初始化格式不能混用2024-10-10