欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java BigDecimal解決double精度丟失的問題

 更新時間:2023年11月12日 10:24:30   作者:Andy_GF  
我們在日常開發(fā)中, 有很多時候會遇到小數(double類型)精確計算,本文主要介紹了Java BigDecimal解決double精度丟失的問題,具有一定的參考價值,感興趣的可以了解一下

我們在日常開發(fā)中, 有很多時候會遇到小數(double類型)精確計算, 由于 double 類型在計算機中的特殊存儲方式, 某些情況下會導致精度丟失, 特別是跟錢有關的計算, 后臺校驗的時候, 那得是分毫不差.

場景

商品a價格是 0.1, 商品b 價格是 0.2, 用戶買了這兩個商品, 付款時, 訂單總金額是 0.3, 如果用 double 類型做計算, 將會得到結果 0.30000000000000004, 前端如果拿來展示總金額, 用戶肯定就蒙圈了, 這顯然不是我們想要的.

那么如何解決呢? Java 給我們提供了專門解決這個問題的類 BigDecimal.

double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c); // 0.30000000000000004

BigDecimal 使用

創(chuàng)建 BigDecimal 對象

創(chuàng)建對象一共有3種方式, 兩個構造器, 一個靜態(tài)方法, 實際靜態(tài)方法是對入參 String 的構造器的封裝, 即 2, 3 兩種方式本質上是一樣的.

 // 1 入參是 double
 BigDecimal a = new BigDecimal(0.3);
 // 2 入參是 String
 BigDecimal b = new BigDecimal("0.3");
 // 3 靜態(tài)方法, 入參是 double
 BigDecimal c =  BigDecimal.valueOf(0.3);

計算操作

公用代碼

double a = 0.1;
double b = 0.2;
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = new BigDecimal(Double.toString(b));

1. 加法 add

這就很好的解決了上面場景中出現的問題

BigDecimal c1 = a1.add(b1);  
System.out.println(c1); // 0.3

2. 減法 subtract

BigDecimal c2 = a1.subtract(b1);  // 減法
System.out.println(c2); // -0.1

3. 乘法

BigDecimal c3 = a1.multiply(b1);  // 乘法
System.out.println(c3); // 0.02

4. 除法

BigDecimal c4 = a1.divide(b1);  // 除法  0.1 / 0.3, 無法除盡, 報錯.
System.out.println(c4); // 0.5

BigDecimal c5 = a1.divide(c1);  // 除法  
System.out.println(c5); // 0.1 / 0.3, 無法除盡, 報錯.

c5 = a1.divide(c1, 2, RoundingMode.HALF_UP);  // 除法  0.1 / 0.3  四舍五入
System.out.println(c5); // 0.5

注意:

BigDecimal 進行除法計算時, 強烈建議使用指定保留小數倍數和舍入模式這個方法, 這樣可以避免除不盡造成的異常.

/**
* 參數1: 除數
* 參數2: 保留小數的位數
* 參數3: 舍入模式
*/
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

5. 保留小數和舍入模式

設置保留小數和舍入模式 setScale 方法

BigDecimal price = new BigDecimal("9.936");
price = price.setScale(2, RoundingMode.HALF_UP); // 2位, 四舍五入
System.out.println(price); // 9.94

6. BigDecimal 轉化為 double

double value = c4.doubleValue();

總結

使用 BigDecimal 計算時要注意以下幾點:

  • 不建議使用入參是 double 的構造器, 因為它仍然存在精度問題.
  • 強烈建議使用入參是 string 的構造器, 或者使用靜態(tài)方法 valueOf 創(chuàng)建對象, 才能保證精度.
  • 使用 BigDecimal 做 除法 時, 必須要使用 divide(BigDecimal divisor, int scale, RoundingMode roundingMode), 防止除不盡造成異常.

到此這篇關于Java BigDecimal解決double精度丟失的問題的文章就介紹到這了,更多相關Java BigDecimal double精度丟失內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring?Cloud?Alibaba負載均衡實現方式

    Spring?Cloud?Alibaba負載均衡實現方式

    這篇文章主要為大家介紹了Spring?Cloud?Alibaba負載均衡實現方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Spring?Boot項目集成Knife4j接口文檔的實例代碼

    Spring?Boot項目集成Knife4j接口文檔的實例代碼

    Knife4j就相當于是swagger的升級版,對于我來說,它比swagger要好用得多<BR>,這篇文章主要介紹了Spring?Boot項目集成Knife4j接口文檔的示例代碼,需要的朋友可以參考下
    2021-12-12
  • Java括號匹配舉例詳解

    Java括號匹配舉例詳解

    看到大家對括號匹配問題很感興趣,下面這篇文章主要給大家介紹了關于Java括號匹配的相關資料,括號匹配是一種常見的編程問題,涉及到在給定的字符串中判斷括號是否匹配,需要的朋友可以參考下
    2023-10-10
  • 養(yǎng)成良好java代碼編碼規(guī)范

    養(yǎng)成良好java代碼編碼規(guī)范

    這篇文章主要介紹了如何養(yǎng)成良好java代碼編碼規(guī)范,規(guī)范需要平時編碼過程中注意,是一個慢慢養(yǎng)成的好習慣,下面小編就帶大家來一起詳細了解一下吧
    2019-06-06
  • 一文搞懂Spring中的Bean作用域

    一文搞懂Spring中的Bean作用域

    scope用來聲明容器中的對象所應該處的限定場景或者說該對象的存活時間,即容器在對象進入其 相應的scope之前,生成并裝配這些對象,在該對象不再處于這些scope的限定之后,容器通常會銷毀這些對象,這篇文章主要介紹了Spring中的Bean作用域,需要的朋友可以參考下
    2022-06-06
  • SpringBoot中的Aop用法示例詳解

    SpringBoot中的Aop用法示例詳解

    這篇文章主要介紹了SpringBoot中的Aop用法,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 解決nacos升級spring cloud 2020.0無法使用bootstrap.yml的問題

    解決nacos升級spring cloud 2020.0無法使用bootstrap.yml的問題

    這篇文章主要介紹了解決nacos升級spring cloud 2020.0無法使用bootstrap.yml的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring AOP的幾種實現方式總結

    Spring AOP的幾種實現方式總結

    本篇文章主要介紹了Spring AOP的幾種實現方式總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • IDEA的.idea文件夾和iml文件使用方式

    IDEA的.idea文件夾和iml文件使用方式

    這篇文章主要介紹了IDEA的.idea文件夾和iml文件使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • jasypt 集成SpringBoot 數據庫密碼加密操作

    jasypt 集成SpringBoot 數據庫密碼加密操作

    這篇文章主要介紹了jasypt 集成SpringBoot 數據庫密碼加密操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論