Java——double类型精度运算

写在前面——接近年底,项目遇到很多报表、结算等类型的需求,自然就会遇到很多double类型的逻辑运算,正巧之前没有总结过这方面的东西,所以就有了这篇帖子。

最开始做的时候比较渣,没有注意两个double类型做逻辑运算最后得到的数字是有误差的(原谅我这个时候有些粗心了),如下所示:

public static void main(String[] args) {
	  double a=1.47;
	  double b=2.34;
    System.out.println(a+b);//结果为:3.8099999999999996
  }

因为在实际项目中还有3位小数、4位小数等,都会出现误差,所以在很多语言中double类型的数值都不能直接进行运算,会出现这种精度问题,试想一下某个客户只有3.8099999999999996元,但是系统认为他有3.81元,可以购买3.81元的商品,久而久之那商家就亏大了,细思极恐啊有木有!

所以要进行double类型的逻辑运算的时候要怎么做才能保证不会出现精度的问题呢?我突然想到在之前看的一本非常经典的书叫做《Effective Java》,Java 之父 James Gosling非常推崇的一本书。里面就提到了float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个构造方法,其中两个对我们有用的分别是:

  1、BigDecimal(double   val)     
                      Translates   a   double   into   a   BigDecimal.     
  2、BigDecimal(String   val)     
                      Translates 

### Java 基本数据类型概述 Java作为一种强类型的编程语言,提供了八种基本数据类型来处理不同种类的数据。这八种基本数据类型可以进一步分类为四种数值型(包括两种整数类型和两种浮点类型)、一种字符类型以及一种布尔类型[^1]。 #### 数值型数据类型 - **整数类型** 整数类型用于表示不带小数部分的数字。Java 中有四个不同的整数类型:`byte`, `short`, `int`, 和 `long`。每种类型都有其特定的取值范围和内存占用大小。 | 类型 | 大小 (位) | 取值范围 | |-------|---------|-----------------------------------| | byte | 8 | -128 到 127 | | short | 16 | -2^31 (-2,147,483,648)到 2^31 - 1(2,147,483,647) | | long | 64 | -2^63 到 2^63 - 1 | - **浮点类型** 浮点类型用来表示带有小数部分的实数。有两种浮点类型可供选择:`float` 和 `double`。默认情况下,所有的浮点字面量都是双精度(`double`)形式。 | 类型 | 大小 (位) | 近似有效位数 | |--|---------|---------------------| | float | 32 | 6 至 7 | | double | 64 | 15 | ```java // 定义各种数值变量的例子 public class NumericTypes { public static void main(String[] args){ byte b = 10; short s = 32767; int i = Integer.MAX_VALUE; // 使用常量定义最大值 long l = Long.MIN_VALUE; System.out.println("Byte value: " + b); System.out.println("Short max value: " + Short.MAX_VALUE); float f = 1.2f; // 需要加 'f' 或者 'F' double d = 1.2e-3; System.out.printf("Float %.2f\n", f); System.out.printf("Double %f\n", d); } } ``` #### 字符与布尔类型 - **字符类型 (`char`)** 是基于 Unicode 编码集的一个单个字符,它采用的是 UTF-16 表示法,在 JVM 上占用了两个字节的空间。它可以存储任何有效的Unicode字符,从 '\u0000'(即0)至'\uffff'(即65535)。 - **布尔类型 (`boolean`)** 仅能持有两个可能的值之一——true 或 false。这种简单却强大的特性使得 boolean 成为了条件表达式的核心组成部分。 ```java // char 和 boolean 的例子 public class CharAndBooleanExample { public static void main(String[] args){ char ch = 'A'; boolean flag = true; System.out.print(ch +" is a "); if(flag){ System.out.println("positive statement."); }else{ System.out.println("negative statement."); } // 输出 ASCII/Unicode code point of the character System.out.println((int)'A'); // prints 65 } } ``` #### 基本数据类型运算 对于上述提到的各种基本数据类型,支持广泛的算术操作如加减乘除模等。此外还有逻辑运算、关系比较以及其他一些特殊的位级运算。这里给出几个简单的实例说明如何执行常见的数学计算: ```java // 算术运算是最常用的 public class ArithmeticOperations { public static void main(String[] args){ int sum = 5 + 3; int difference = 10 - 4; int product = 6 * 7; int quotient = 9 / 3; int remainder = 10 % 3; System.out.println("Sum: "+sum+", Difference:"+difference+ ", Product:"+product+", Quotient:"+quotient+ ", Remainder:"+remainder); // 自增自减操作 int num = 1; ++num; // pre-increment num++; // post-increment System.out.println(num); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值