🗒️ 数值处理: Math、Biginteger、 BigDecimal
Mar 28, 2024
| Apr 3, 2024
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password

什么是Math类?

Math 类提供了一系列静态方法用于执行基本的数学运算,使得进行科学计算和常规数值处理变得更加方便。
以下是对 Math 类提供的关键功能的详细介绍:
  • 基本数学运算
    • 四则运算:虽然四则运算(加、减、乘、除)可以直接通过 Java 的运算符完成,但 Math 类提供了更多的数学运算功能,如次方(pow)、平方根(sqrt)、立方根(cbrt)等。
      绝对值:abs 方法可以返回任何数字类型(整数或浮点数)的绝对值。
  • 高级数学函数
    • 三角函数:包括 sincostan 等常用的三角函数,以及它们的反函数 asinacosatan,和 atan2(一种特殊的反正切函数,可以根据正切值的符号确定正确的象限)。
      指数和对数函数:exp 计算 e(自然对数的底数)的指数,log 计算自然对数,log10 计算以 10 为底的对数。
  • 舍入函数
    • round:根据数值返回最接近的整数,支持 floatdouble 类型。
      ceilfloorceil 函数计算大于或等于给定值的最小整数,floor 函数计算小于或等于给定值的最大整数。rint:返回最接近参数的整数值,如果两个整数同样接近,则结果取偶数。
  • 随机数生成
    • random:返回一个 double 类型的随机数,范围在 0.0 到 1.0 之间(包括 0.0 但不包括 1.0)。
  • 常量
    • PI:表示圆周率π的常量,用于圆形和球体的计算。
      E:表示自然对数的底数 e 的常量,用于指数和对数运算。
应用场景
  • 科学计算:在需要进行复杂数学运算,如指数、对数、三角函数等的科学计算项目中广泛使用。
  • 图形和游戏开发:在处理图形变换、计算角度或距离等图形和游戏编程中经常使用。
  • 工程计算:在需要精确计算,如声学、光学、力学等领域的工程计算中使用。
  • 日常编程:用于执行基本的数学运算,比如求绝对值、四舍五入、求最大最小值等。

为什么使用BigInteger类?

注意:Java的包(package)机制主要用于组织类和接口,帮助开发者管理项目中的代码结构,防止命名冲突,并控制访问级别。包机制并不限制类之间的继承关系。只要一个类是可访问的(即具有适当的访问控制修饰符),它就可以被任何其他类继承,无论这两个类是否位于同一个包中。
BigInteger 类在某些方面比基本的整数类型 intlong 更加灵活和强大,主要好处包括:
  1. 无限的大小或任意精度int 类型是一个 32 位的整数,范围从 -2^31 到 2^31-1;long 类型是一个 64 位的整数,范围从 -2^63 到 2^63-1。而 BigInteger 支持任意精度的整数,其大小仅受可用内存的限制。这意味着当你需要处理超过 long 范围的大整数时,BigInteger 是必须的。
  1. 丰富的操作方法BigInteger 提供了一系列方法来执行整数的算术运算(加、减、乘、除、求余等)、位运算(位与、位或、位非等)、幂运算和素数运算等,这些方法的使用和功能远远超过基本整数类型。
  1. 高精度计算:在需要非常精确的整数计算,比如加密解密、大数运算等领域,BigInteger 提供了必要的精确度和操作方法。
  1. 灵活的数值转换BigInteger 提供了从字符串、字节数组等多种方式创建大整数的能力,也可以轻松地转换回这些格式,这在处理非常大的数值时非常有用。
尽管 BigInteger 提供了许多优势,但它也有一些缺点,如相比于基本整数类型,其性能较低,使用也更复杂。因此,BigInteger 在处理非常大的整数或需要高精度整数运算时比 intlong 更有优势,但在常规情况下,出于性能的考虑,仍然推荐使用基本的整数类型。
应用场景
  • 加密和安全:在处理大数加密算法,如RSA加密等领域,需要使用BigInteger来处理非常大的整数运算。
  • 精确的整数计算:在财务应用、会计软件或其他需要精确计算大整数且不允许有任何舍入误差的应用中使用。
  • 科学研究:在需要进行大数运算的科学研究领域,如天体物理学、基因工程序列分析等。

为什么使用BigDecimal类?

在某些场景下,使用BigDecimal类的原因是因为浮点数(floatdouble)有误差,而 BigDecimal 没有误差。
浮点数的误差原因:
浮点数在计算机中的表示基于IEEE 754标准。这种表示方式将一个数拆分为基数(mantissa)和指数(exponent),并且都是以二进制形式存储。这意味着浮点数在存储时实际上是以 (基数) * 2^(指数) 的形式表示的。
但是,许多十进制小数在转换为二进制表示时会变成无限循环小数。例如,十进制的0.1转换为二进制表示是一个无限循环小数。由于计算机内存有限,这种无限循环小数必须在某一点截断,这导致了精度的损失。
在编程中将一个十进制浮点数赋值给浮点变量时,十进制小数会转换到二进制小数。
当进行浮点数的算术运算时,比如加法、减法、乘法和除法,如果操作数是以十进制形式给出,它们首先会被转换为二进制形式进行计算,计算结果通常也是二进制浮点数,可能再次被转换回十进制形式以显示给用户。
BigDecimal 的高精度:
相比之下,BigDecimal 是一个基于任意精度的十进制数的类。它实际上是通过一个整数(可以是非常大的整数)和一个标明小数点位置的标度(scale)来精确表示小数的。BigDecimal 用这种方式可以精确地表示小数,而不受二进制表示的限制。因此,使用 BigDecimal 可以进行精确的小数运算,而不会引入舍入误差。
此外,BigDecimal 提供了一系列方法来进行数学运算,这些方法允许明确指定舍入模式等,进一步确保了计算的精确性。
应用场景
  • 金融计算:在金融领域,尤其是处理货币、利率、金融衍生品定价等需要高精度小数计算的场景中广泛使用。舍入误差在这些计算中是不可接受的。
  • 会计系统:在需要进行精确小数运算且不能有任何舍入误差的会计和财务系统中。
  • 商业计算:在电子商务、税务计算等需要精确小数点后多位的计算中使用。
  • 科学测量:在需要高度精确测量和计算的科学领域,如材料科学中材料属性的精确测量。
  • java
  • java basics
  • 配置文件:xml、propertiesjava异常处理
    Catalog