当前位置: 代码迷 >> 综合 >> 基本数据类型、包装数据类型、BigDecimal使用注意事项
  详细解决方案

基本数据类型、包装数据类型、BigDecimal使用注意事项

热度:15   发布时间:2023-10-15 06:50:11.0
	public static void main(String[] args) {/*** 所有的POJO都使用包装数据类型;* 所有的RPC调用参数和返回值都使用包装数据类型;* 所有的局部变量都使用基本数据类型;*//*** 对于 Integer在-128 至 127 之间的赋值,Integer对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。*/Integer v1 = 134;Integer v2 = 133 + 1;System.out.println(v1 == v2); // falseInteger v3 = 126;Integer v4 = 127 - 1;System.out.println(v3 == v4); // trueint v5 = 126;int v6 = 127 - 1;System.out.println(v5 == v6); // trueInteger v7 = 122;int v8 = 120 + 2;System.out.println(v7 == v8); // true/*** 浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals来判断。说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数*/float f1 = 1.2f-0.9f;float f2 = 0.3f;System.out.println(f1 == f2); // falsedouble d1 = 2.2d-0.9d;double d2 = 1.3d;System.out.println(d1 == d2); // falseFloat f3 = 1.21f + 0.8f;Float f4 = 2.01f;System.out.println(f3.equals(f4)); // true// 使用 BigDecimal 来定义值,再进行浮点数的运算操作。BigDecimal a = new BigDecimal("1.0");BigDecimal b = new BigDecimal("0.9");BigDecimal c = new BigDecimal("0.8");BigDecimal x = a.subtract(b);BigDecimal y = b.subtract(c);if (x.equals(y)) {System.out.println("true");}/*** 禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象。说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。如:BigDecimal g = new BigDecimal(0.1f); 实际的存储值为:0.10000000149优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。*/BigDecimal recommend1 = new BigDecimal("0.1");BigDecimal recommend2 = BigDecimal.valueOf(0.1);}