Java用BigDecimal解決double類(lèi)型相減時(shí)可能存在的誤差
double類(lèi)型的兩個(gè)數(shù)相減可能存在誤差,比如System.out.println(2099 - 1999.9);的結(jié)果為99.09999999999991
可以用BigDecimal解決:
public class TestDouble { //兩個(gè)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(); } //兩個(gè)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(); } //兩個(gè)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(); } // 兩個(gè)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的情況時(shí)往上近似 * * @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.0009999999999899.001------------------------------------4197997.9014197997.901------------------------------------1.04950052475026251.0495
到此這篇關(guān)于Java用BigDecimal解決double類(lèi)型相減時(shí)可能存在的誤差的文章就介紹到這了,更多相關(guān)Java double相減誤差內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. python中scrapy處理項(xiàng)目數(shù)據(jù)的實(shí)例分析2. Django ORM實(shí)現(xiàn)按天獲取數(shù)據(jù)去重求和例子3. 教你在 IntelliJ IDEA 中使用 VIM插件的詳細(xì)教程4. IntelliJ IDEA導(dǎo)入jar包的方法5. Python requests庫(kù)參數(shù)提交的注意事項(xiàng)總結(jié)6. js抽獎(jiǎng)轉(zhuǎn)盤(pán)實(shí)現(xiàn)方法分析7. 快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載)8. python操作mysql、excel、pdf的示例9. 如何基于Python實(shí)現(xiàn)word文檔重新排版10. vue-electron中修改表格內(nèi)容并修改樣式
