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等

BigDecimal,注解的更多相关文章

  1. Dagger2学习笔记

    Dagger2是第一个使用生成代码的方式实现依赖注入的框架.作为Dagger的升级版本,自然有它的优势,优先注重的是执行效率.本文着重介绍Dagger2.官方据点传送门: https://google ...

  2. 【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)

    前言 译文链接:http://websystique.com/spring/spring4-hibernate4-mysql-maven-integration-example-using-annot ...

  3. jdbctemplate中的批量更新使用,BigDecimal与造型的联系和区别

    //jdbctemplate批量新增的使用MENU_ID_LIST是前端页面传递到后端控制层,再由控制层传到实现层的List //JdbcTemplate是spring jdbctemplate通过注 ...

  4. jackson注解使用心得

    maven依赖: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId ...

  5. 简单的JPA注解例子

    package ssh.entity; import java.math.BigDecimal; import java.util.Date; import javax.persistence.*; ...

  6. morhia解决BigDecimal映射问题

    错误信息:morphia No usable constructor for java.math.BigDecimal 解决办法:增加自定义类型转换器,代码如下 package cn.huilink. ...

  7. spring MVC注解深入研究

    @Controller @Service  @Controller和 @Component注册一个action 到spring 上下文中,bean 的ID 默认为类名称开头字母小写.@Reposito ...

  8. jackson annotations注解详解 (zhuan)

    http://blog.csdn.net/sdyy321/article/details/40298081 ************************************** 官方WIKI: ...

  9. JPA的Column注解总结

    就像@Table注解用来标识实体类与数据表的对应关系类似,@Column注解来标识实体类中属性与数据表中字段的对应关系. 该注解的定义如下: @Target({METHOD, FIELD}) @Ret ...

随机推荐

  1. Linux基础:seq命令总结

    本文只总结一些常用的用法,更详细的说明见man seq和 seq --help. seq命令 seq命令用于输出数字序列. 语法格式 Usage: seq [OPTION]... LAST or: s ...

  2. ZooKeeper 运维经验

    转自:http://www.juvenxu.com/2015/03/20/experiences-on-zookeeper-ops/ ZooKeeper 运维经验 ZooKeeper 是分布式环境下非 ...

  3. Python中的特殊方法:__call__

    本文结构: 1.__call__方法 2.callable():判断对象/函数能否被调用 3.举例:斐波那契数列类 1.__call__方法 一个对象实例可以有自己的属性和方法,当我们调用实例方法时, ...

  4. Golang - 开篇必须吹牛逼

    目录 Golang - 开篇必须吹牛逼 Go牛逼吗 安装环境 Golang - 开篇必须吹牛逼 (1)我们为什么要学 高并发 深度 || 广度 (2)go学习思路和目标 多打多练 掌握go语言 做一个 ...

  5. jetty+httpClient使用

    背景: 看了https://www.cnblogs.com/donlianli/p/10954716.html这篇文章之后,突然发现自己的知识面太窄了,连这些几乎可以说基础的工具都没怎么用过,于是决定 ...

  6. i=i+1,i+=1与i++的区别

    1. i=i+1 a.读取右i的地址 b,i=1 c.读取左i的地址 d. 值赋给左i 2.i+=1 a.读取左i的地址 b.i+1 c.值给i 3.i++ a.读取右i的地址 b.值加1

  7. ExtJs之Ajax模式的表单数据加载

    简单: <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-e ...

  8. Lua5.2 请求 luasocket 相关模块时的 multiple-lua-vms-detected

    首先说一下5.3貌似没有这个问题, 可是眼下最新版的luasocket 3.0 rc1仅仅能支持5.2, 5.3调用的话程序会崩溃(不知道是不是我没配置好) 出现这个问题的解决办法, 想必网上有非常多 ...

  9. jQuery中的closest()和parents()的差别

    jQuery中的closest()和parents()的差别 jQuery中closest()和parents()的作用非常类似,都是向上寻找符合选择器条件的元素,可是他们之间有一些细微的差别,官网也 ...

  10. Ural 1167 Bicolored Horses (DP)

    题目地址:Ural 1167 感觉这题的思路类似于背包的做法. . 先预处理出来每一个马与之前全部的马的0的数量和1的数量,用数组a[0][i]和a[1][i]来表示. 然后再用数组dp[i][j]来 ...