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等