BigDecimal,注解


BigDecimal

問題重現

今天在干活的途中,發現一個很坑爹的問題,讓我來復現下問題:

  • 從上游接口獲得的余額,對於為0的,做了判斷
BigDecimal a = new BigDecimal(acceptData);
if ( a == BigDecimal.ZERO) ...
  • 然后發現線上有對比問題;
  • 試驗了下
BigDecimal a = BigDecimal.ZERO;
BigDecimal b = new BigDecimal("0.00");
Boolean c = a == b;
BigDecimal d = new BigDecimal(0.5);
BigDecimal e = new BigDecimal("0.5");
  • 然后很神奇的發現,bigDecimal很不乖。。。

原因

BigDecimal最早出現也是因為計算精度的問題,用float或者double會造成精度丟失;

但是,用


BigDecimal d = new BigDecimal(0.5);

直接賦值,會發現,

d=0.512121315421654616544...

這樣子很神奇的一串數字。

然后,還會發現,上面兩個“零值”相比是不同的,這也是我代碼出現問題的原因。

查東西,會發現,對於BigDecimal的賦值,一般推薦使用基於String的構造器;

否則,由於上面這種情況,依然會造成精度的丟失,還更加麻煩。

說到麻煩,若是涉及BigDecimal的計算,推薦單獨寫方法聚合在一起!!

因為,比如double,要先轉成String,然后再構造BigDecimal對象,計算完再轉成double


注解

Annotation,從寫java以來就常用到,因為真tm好用,但,一直沒搞懂,也沒有自己定義過注解。

定義些

其實,首先要明白的就是,注解是Java中一種特殊的標記;

對於標記的代碼,會做相應的處理,不管是傳值也好,做操作也好,標記提示開發人員也好,本質上是個標記。

對於標記的操作,需要反射回來,做相應的處理的。

構成

記個公式吧:

注解 = 5個基本注解 + 6個元注解 + 自定義注解 + APT(Annotation Processing Tool)

其中的內容到處都查得到,自己查吧

實現

通過實現一個自定義注解來熟悉下

@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Testable {
    String name();
}


public class AnnotationTest {

    @Testable(name = "shit")
    public void  test(){

        Class<String> a = new Class<String>();
        a.getAnnotations()
    }
}

呃,代碼沒寫完。。。

反正就是用反射,拿到參數值進行利用。

所以這里又有兩個坑:反射以及泛型。

另外最后再記錄下

  • Retention:注解可以保留多長時間;CLASS 編譯器將把注解記錄在class文件中,jvm不可獲取信息;RUNTIME 記錄在class中,且jvm可以獲取信息; SOURCE 只保留在源代碼中;
  • TARGET:修飾哪些程序單元,比如METHOD,TYPE等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM