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. vue,基础整理,夯实基础,为进阶打基础

    把基础部分,再次系统的了解一遍,整理成文档.

  2. [POJ2404]Jogging Trails

    我太弱了. 我们可以知道一个结论就是对于一个图的话假如所有点的度数都是偶数,那么只需要走一波欧拉回路. 所以我们就把奇点补成偶点. 将两个奇点补充到偶点的最佳方法是选择任意两个奇点连最短路径为权的边 ...

  3. Codeforces 898D - Alarm Clock

    传送门:http://codeforces.com/contest/898/problem/D 有n个闹钟,第i(1≤i≤n)个闹钟将在第ai(1≤ai≤106)分钟鸣响,鸣响时间为一分钟.当在连续的 ...

  4. 【微软2017年预科生计划在线编程笔试 B】Tree Restoration

    [题目链接]:https://hihocoder.com/problemset/problem/1490 [题意] 给你一棵树的以下信息: 1.节点个数 2.给出树的每一层从左到右的顺序每个节点的编号 ...

  5. SpringCloud Config 分布式配置中心

    一.分布式系统面临的问题---配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的 ...

  6. States of Integrity Constraints

    States of Integrity Constraints As part of constraint definition, you can specify how and when Oracl ...

  7. python+Android+uiautomator的环境

    Python+Android+uiautomator的环境搭建 Python 下载适合系统的版本并安装,安装时勾选把路径加入path 验证:windows下打开cmd输入python 出现以下界面说明 ...

  8. PlayerPrefs存储Vector3等结构数据

     孙广东   2016.3.31 之前有网友询问这个问题, 当时我仅仅是 提供了一个思路, 使用json序列化.反序列化. 以下就写出两种(都是仅仅能变成字符串) 1.json的序列化.反序列化方 ...

  9. 二重积分的计算 —— 交换积分顺序(exchange the order of integration)

    交换积分顺序的诀窍在数形结合: 1. 几句顺口溜 后积先定限,限内穿条线,先交下限写,后交上限见 先积 x,画横线(平行于 x 轴),右减左: 先积 y,画竖线(平行于 y 轴),上减下: 2. 简单 ...

  10. 彻底弄懂px em rem

    国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的 ...