BigDecimal 問題重現 今天在幹活的途中,發現一個很坑爹的問題,讓我來複現下問題: 從上游介面獲得的餘額,對於為0的,做了判斷 然後發現線上有對比問題; 試驗了下 然後很神奇的發現,bigDecimal很不乖。。。 原因 BigDecimal最早出現也是因為計算精度的問題,用float或者d ...
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等