国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal

這篇具有很好參考價(jià)值的文章主要介紹了Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

場(chǎng)景

阿里Java開發(fā)手冊(cè)嵩山版中明確指出:

1、BigDecimal的等值比較應(yīng)使用compareTo()方法,而不是equals()方法

equals()方法會(huì)比較值和精度(1.0與1.00返回結(jié)果為false),而compareTo()則會(huì)忽略精度

2、禁止使用構(gòu)造方法BigDecimal(double)的方式把double值轉(zhuǎn)換為BigDecimal對(duì)象

BigDecimal(double)存在精度損失風(fēng)險(xiǎn),在精確計(jì)算或值比較的場(chǎng)景中可能會(huì)導(dǎo)致業(yè)務(wù)邏輯異常

Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal

注:

博客:
霸道流氓氣質(zhì)的博客_CSDN博客-C#,架構(gòu)之路,SpringBoot領(lǐng)域博主

Java開發(fā)手冊(cè)為什么禁止使用BigDecimal的equals方法做等值比較?

BigDecimal,相信對(duì)于很多人來說都不陌生,很多人都知道他的用法,這是一種java.math 包中提供的一種可以用來

進(jìn)行精確運(yùn)算的類型。在進(jìn)行金額表示、金額計(jì)算等場(chǎng)景,不能使用 double、float 等類型,而是要使用對(duì)精度支持

更好的 BigDecimal。其內(nèi)部自帶了很多方法,如加,減,乘,除等運(yùn)算方法都是可以直接調(diào)用的。除了需要用

BigDecimal 表示數(shù)字和進(jìn)行數(shù)字運(yùn)算以外,代碼中還經(jīng)常需要對(duì)于數(shù)字進(jìn)行相等判斷。Java開發(fā)手冊(cè)中有說明:

BigDecimal的等值比較應(yīng)使用compareTo()方法,而不是equals()方法

equals()方法會(huì)比較值和精度(1.0與1.00返回結(jié)果為false),而compareTo()則會(huì)忽略精度。

看下面的示例:

??????? BigDecimal bigDecimal = new BigDecimal(1);
??????? BigDecimal bigDecimal1 = new BigDecimal(1);
??????? System.out.println(bigDecimal.equals(bigDecimal1));//true

??????? BigDecimal bigDecimal2 = new BigDecimal(1);
??????? BigDecimal bigDecimal3 = new BigDecimal(1.0);
??????? System.out.println(bigDecimal2.equals(bigDecimal3));//true

??????? BigDecimal bigDecimal4 = new BigDecimal("1");
??????? BigDecimal bigDecimal5 = new BigDecimal("1.0");
??????? System.out.println(bigDecimal4.equals(bigDecimal5));//false

通過以上代碼示例,我們發(fā)現(xiàn),在使用 BigDecimal 的 equals 方法對(duì) 1 和 1.0 進(jìn)行比較的時(shí)候,

有的時(shí)候是 true(當(dāng)使用 int、double 定義 BigDecimal 時(shí)),有的時(shí)候是false(當(dāng)使用 String 定義 BigDecimal 時(shí))。

查看源碼可知,equals會(huì)比較標(biāo)度scale,見源碼

Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal

BigDecimal 一共有以下 4 個(gè)構(gòu)造方法:

BigDecimal(int) 因?yàn)槭钦麛?shù),所以標(biāo)度就是 0

BigDecimal(double) 無論我們使用 new BigDecimal(0.1)還是 new BigDecimal(0.10)定義,他的近似值

都是0.1000000000000000055511151231257827021181583404541015625

這個(gè),那么他的標(biāo)度就是這個(gè)數(shù)字的位數(shù),即 55

BigDecimal(long) 因?yàn)槭钦麛?shù),所以標(biāo)度就是 0

BigDecimal(String)? BigDecimal(“1”)和 BigDecimal(“1.0”)的標(biāo)度不一樣

BigDecimal 中提供了 compareTo 方法,這個(gè)方法就可以只比較兩個(gè)數(shù)字的值,如果兩個(gè)數(shù)相等,則返回 0。

BigDecimal bigDecimal6 = new BigDecimal("1");

BigDecimal bigDecimal7 = new BigDecimal("1.0000");

System.out.println(bigDecimal6.compareTo(bigDecimal7)); //0

Java開發(fā)手冊(cè)為什么禁止使用double直接構(gòu)造BigDecimal

Java開發(fā)手冊(cè)中要求 禁止使用構(gòu)造方法BigDecimal(double)的方式把double值轉(zhuǎn)換為BigDecimal對(duì)象

說明:BigDecimal(double)存在精度損失風(fēng)險(xiǎn),在精確計(jì)算或值比較的場(chǎng)景中可能會(huì)導(dǎo)致業(yè)務(wù)邏輯異常

比如下面,實(shí)際存儲(chǔ)值為0.10000000149

BigDecimal bigDecimal = new BigDecimal(0.1F);

Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal

優(yōu)先推薦入?yún)镾tring 的構(gòu)造方法,或使用BigDecimal的valueOf方法,此方法其實(shí)內(nèi)部執(zhí)行了Double的toString,

而Double的toString按double的實(shí)際能表達(dá)的精度對(duì)尾數(shù)進(jìn)行了截?cái)唷?/p>

BigDecimal bigDecimal1 = new BigDecimal("0.1");

BigDecimal bigDecimal2 = BigDecimal.valueOf(0.1);

Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal

Java中doble為什么不精確?

十進(jìn)制小數(shù)轉(zhuǎn)成二進(jìn)制,一般采用”乘 2 取整,順序排列”方法,如 0.625 轉(zhuǎn)成二進(jìn)制的表示為 0.101。

但是,并不是所有小數(shù)都能轉(zhuǎn)成二進(jìn)制,如 0.1 就不能直接用二進(jìn)制表示,他的二進(jìn)制是 0.000110011001100...

這是一個(gè)無限循環(huán)小數(shù)。所以,計(jì)算機(jī)是沒辦法用二進(jìn)制精確的表示 0.1 的。也就是說,在計(jì)算機(jī)中,

很多小數(shù)沒辦法精確的使用二進(jìn)制表示出來。在 Java 中,使用 float 和 double 分別用來表示單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)。

所謂精度不同,可以簡(jiǎn)單的理解為保留有效位數(shù)不同。采用保留有效位數(shù)的方式近似的表示小數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-467411.html

到了這里,關(guān)于Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • spark底層為什么選擇使用scala語言開發(fā)

    基于Scala的語言特性 集成性:Scala 是一種運(yùn)行在 Java 虛擬機(jī)(JVM)上的靜態(tài)類型編程語言,可以與 Java 代碼無縫集成。由于 Spark 涉及到與大量 Java 生態(tài)系統(tǒng)的交互,例如 Hadoop、Hive 等,使用 Scala 可以方便地與這些組件進(jìn)行集成和交互。 函數(shù)式編程支持:Scala 是一種面向函數(shù)

    2024年02月10日
    瀏覽(34)
  • 【JAVA】為什么要使用封裝以及如何封裝

    【JAVA】為什么要使用封裝以及如何封裝

    個(gè)人主頁:【??個(gè)人主頁】 系列專欄:【??初識(shí)JAVA】 Java的封裝指的是在一個(gè)類中將數(shù)據(jù)和方法進(jìn)行封裝,使其可以保護(hù)起來,只能在該類內(nèi)部訪問,而不允許外部直接訪問和修改。這是Java面向?qū)ο缶幊痰娜齻€(gè)基本特性之一,另外兩個(gè)是繼承和多態(tài)。在此之前我們已經(jīng)學(xué)

    2024年02月08日
    瀏覽(19)
  • 為什么要使用零知識(shí)證明來開發(fā)跨鏈協(xié)議

    在過去的幾年當(dāng)中出現(xiàn)了各種各樣的獨(dú)立公鏈以及以太坊 Layer 2。 由于在安全性、低成本、快速交易以及開發(fā)者和用戶社區(qū)差異等方面,不同鏈都具有各自不同的優(yōu)勢(shì),用戶在不同鏈之間切換使用的行為是很常見的。 比起以太坊鏈,Layer2 以及其他獨(dú)立公鏈上的手續(xù)費(fèi)會(huì)更加

    2024年01月19日
    瀏覽(56)
  • Java面試題:為什么HashMap不建議使用對(duì)象作為Key?

    HashMap 是一種基于哈希表的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),它允許使用任意不可變對(duì)象作為鍵(key)來存儲(chǔ)和檢索數(shù)據(jù)。然而,在某些情況下,使用對(duì)象作為 HashMap 的鍵可能會(huì)遇到一些問題。 ? 首先,我們需要明確對(duì)象作為 HashMap 的鍵需要滿足一些條件: 不可變性:對(duì)象的屬性不能被修改,

    2024年04月22日
    瀏覽(21)
  • 為什么越來越多的開發(fā)者放棄使用Postman,而選擇Apifox

    為什么越來越多的開發(fā)者放棄使用Postman,而選擇Apifox

    1、Postman + Swagger + Mock + JMeter 作為一個(gè)后端開發(fā),我做的大部分項(xiàng)目一般都是基于 Swagger 來管理 API 文檔,基于 Postman 來做接口調(diào)試,基于 JMeter 來做接口性能測(cè)試,基于 RAP 等工具 Mock API 數(shù)據(jù)。 2、存在的問題 (1)多系統(tǒng)數(shù)據(jù)不互通 API設(shè)計(jì)者、前端開發(fā)、后端開發(fā)、測(cè)試人

    2024年01月20日
    瀏覽(33)
  • 什么是 Java 中的數(shù)據(jù)庫連接池?為什么使用連接池來管理數(shù)據(jù)庫連接?

    什么是 Java 中的數(shù)據(jù)庫連接池?為什么使用連接池來管理數(shù)據(jù)庫連接?

    數(shù)據(jù)庫連接池(database connection pool)是在 Java 中用于管理數(shù)據(jù)庫連接的一種技術(shù)。它的主要目的是提高數(shù)據(jù)庫連接的重用性和性能。在傳統(tǒng)的數(shù)據(jù)庫連接方式中,每次與數(shù)據(jù)庫建立連接時(shí)都需要進(jìn)行一系列的網(wǎng)絡(luò)通信和身份驗(yàn)證操作,這樣的開銷較大并且會(huì)影響應(yīng)用程序的性

    2024年02月06日
    瀏覽(33)
  • Android組件化架構(gòu)開發(fā)--為什么要使用組件化?組件分層?組件路由的簡(jiǎn)單實(shí)現(xiàn)。

    Android組件化架構(gòu)開發(fā)--為什么要使用組件化?組件分層?組件路由的簡(jiǎn)單實(shí)現(xiàn)。

    1.1 單工程項(xiàng)目結(jié)構(gòu) 一般我們都是一個(gè)業(yè)務(wù)建一個(gè)包 缺點(diǎn): 各種業(yè)務(wù)代碼混雜在同一個(gè)模塊里,開發(fā)人員在開發(fā)、調(diào)測(cè)過程的效率越來越低,定位某個(gè)業(yè)務(wù)問題,需要在多個(gè)業(yè)務(wù)代碼混合的模塊中尋找和跳轉(zhuǎn)。 需要了解各個(gè)業(yè)務(wù)的功能,避免代碼的改動(dòng)影響其它業(yè)務(wù)的功能

    2024年02月10日
    瀏覽(26)
  • 在Java中使用FileReader.read()進(jìn)行讀取文件時(shí),為什么亂碼??jī)蓚€(gè)方法解決

    在Java中使用FileReader.read()進(jìn)行讀取文件時(shí),為什么亂碼??jī)蓚€(gè)方法解決

    ?以上代碼是有可能出現(xiàn)代碼輸出混亂的情況的,輸出效果如下: 可能會(huì)出現(xiàn)亂碼的問題: 原因可能是文件編碼與程序讀取時(shí)使用的編碼不一致。在創(chuàng)建 FileReader 對(duì)象時(shí),沒有指定文件的編碼格式,因此默認(rèn)使用的是系統(tǒng)默認(rèn)的編碼格式。如果文件中包含非系統(tǒng)默認(rèn)編碼格式

    2024年02月03日
    瀏覽(27)
  • java的springboot框架中使用logback日志框架使用RabbitHandler注解為什么獲取不到消費(fèi)的traceId信息?

    當(dāng)使用 Logback 日志框架和 RabbitMQ 的 @RabbitHandler 注解時(shí),如果無法獲取消費(fèi)的 traceId 信息,可能是因?yàn)樵谔幚?RabbitMQ 消息時(shí),沒有正確地將 traceId 傳遞到日志中。 為了將 traceId 傳遞到日志中,你可以利用 MDC(Mapped Diagnostic Context)機(jī)制。MDC 是一個(gè)線程綁定的上下文容器,允許

    2024年02月09日
    瀏覽(33)
  • 為什么我心中TOP1的編程語言是Java?我為什么選擇Java?

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包