• 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等
  • 相关阅读:
    联赛模拟测试19
    联考Day5
    联赛模拟测试18(A.施工未补)
    题解 CF960G 【Bandit Blues】
    题解 P5518 【[MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题】
    概率与数学期望笔记
    题解 P3704 【[SDOI2017]数字表格】
    主定理
    【题解】Hikari与组合数
    【题解】P2303 [SDOI2012] Longge 的问题
  • 原文地址:https://www.cnblogs.com/andy1202go/p/8059604.html
Copyright © 2020-2023  润新知