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.00099999999998
99.001
------------------------------------
4197997.901
4197997.901
------------------------------------
1.0495005247502625
1.0495
到此這篇關(guān)于Java用BigDecimal解決double類(lèi)型相減時(shí)可能存在的誤差的文章就介紹到這了,更多相關(guān)Java double相減誤差內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的示例
本文主要介紹了MyBatis-Plus攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
IDEA無(wú)法識(shí)別SpringBoot項(xiàng)目的簡(jiǎn)單解決辦法
今天使用idea的時(shí)候,遇到idea無(wú)法啟動(dòng)springboot,所以這篇文章主要給大家介紹了關(guān)于IDEA無(wú)法識(shí)別SpringBoot項(xiàng)目的簡(jiǎn)單解決辦法,需要的朋友可以參考下2023-08-08
Java動(dòng)態(tài)獲取實(shí)現(xiàn)類(lèi)的方式詳解
這篇文章主要介紹了Java動(dòng)態(tài)獲取實(shí)現(xiàn)類(lèi)的方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2024-01-01
Spring gateway + Oauth2實(shí)現(xiàn)單點(diǎn)登錄及詳細(xì)配置
gateway是基于 WebFlux的響應(yīng)式編程框架,所以在使用securityConfig時(shí)采用的注解是@EnableWebFluxSecurity,接下來(lái)通過(guò)本文給大家介紹Spring gateway + Oauth2實(shí)現(xiàn)單點(diǎn)登錄及詳細(xì)配置,感興趣的朋友一起看看吧2021-09-09
Spring Boot 自定義 Shiro 過(guò)濾器無(wú)法使用 @Autowired問(wèn)題及解決方法
這篇文章主要介紹了Spring Boot 自定義 Shiro 過(guò)濾器無(wú)法使用 @Autowired問(wèn)題及解決方法 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
解決idea找不到類(lèi)could not find artifact問(wèn)題
本文總結(jié)了解決Java項(xiàng)目中找不到類(lèi)的問(wèn)題的常見(jiàn)解決方案,包括刷新Maven項(xiàng)目、清理IDEA緩存、Maven Clean Install、重新Package、解決依賴(lài)沖突和手動(dòng)導(dǎo)入依賴(lài)包等方法2025-01-01

