java 数学计算的具体使用

java.lang.Math 库提供了常用的数学计算工具

常量

final double E = 2.7182818284590452354;         // 自然对数底数
final double PI = 3.14159265358979323846;        // 圆周率
final double DEGREES_TO_RADIANS = 0.017453292519943295; // 角度转弧度
final double RADIANS_TO_DEGREES = 57.29577951308232;  // 弧度转角度

取整

  • abs(x): 绝对值
  • floor(x): 向下取整
  • ceil(x): 向上取整
  • round(x): 四舍五入,如果有两个(x.5),返回较大的那个数
  • rint(x): 最接近的整数,如果有两个(x.5),返回偶数
  • floorDiv(x, y): 向下取整除法
  • floorMod(x, y): java 默认的取摸 % 得到的结果和 x 的符号相同,floorMod 和 y 的符号相同
double delta = 0.0000001;
assertEquals(Math.abs(-6), 6);
assertEquals(Math.floor(-6.2), -7, delta); // 向下取整
assertEquals(Math.floor(6.2), 6, delta);
assertEquals(Math.floor(6.8), 6, delta);
assertEquals(Math.ceil(-6.2), -6, delta);  // 向上取整
assertEquals(Math.ceil(6.2), 7, delta);
assertEquals(Math.ceil(6.8), 7, delta);
assertEquals(Math.round(-6.2), -6, delta); // 四舍五入
assertEquals(Math.round(6.2), 6, delta);
assertEquals(Math.round(6.8), 7, delta);
assertEquals(Math.round(-6.5), -6, delta);
assertEquals(Math.round(6.5), 7, delta);
assertEquals(Math.rint(-6.2), -6, delta); // 最接近整数,如果存在两个,返回偶数
assertEquals(Math.rint(6.2), 6, delta);
assertEquals(Math.rint(6.8), 7, delta);
assertEquals(Math.rint(-6.5), -6, delta);
assertEquals(Math.rint(6.5), 6, delta);

assertEquals(Math.floorDiv(7, 3), 2);
assertEquals(Math.floorDiv(-7, 3), -3);
assertEquals(Math.floorMod(7, 3), 1);
assertEquals(Math.floorMod(-7, -3), -1);
assertEquals(Math.floorMod(-7, 3), 2);
assertEquals(-7 % -3, -1);
assertEquals(-7 % 3, -1);

三角函数

assertEquals(Math.sin(Math.PI / 2), 1.0, delta);
assertEquals(Math.cos(Math.PI), -1, delta);
assertEquals(Math.tan(Math.PI / 4), 1.0, delta);
assertEquals(Math.asin(1), Math.PI / 2, delta);
assertEquals(Math.acos(-1), Math.PI, delta);
assertEquals(Math.atan(1), Math.PI / 4, delta);

指数对数

  • pow(x, y): x^y,x 的 y 次方
  • sqrt(x): √x,x 的平方根
  • cbrt(x): 三次方根
  • hypot(x, y): √(x² + y²)
  • exp(x): e ^ x
  • expm1(x): e ^ x - 1
  • log(x): ln(x)
  • log10: lg(x)
  • log1p(x): ln(1+x)
assertEquals(Math.pow(3, 2), 9, delta);
assertEquals(Math.pow(2, 3), 8, delta);
assertEquals(Math.sqrt(4), 2, delta);
assertEquals(Math.cbrt(27), 3, delta);
assertEquals(Math.hypot(3, 4), 5, delta);  // √(x² + y²)

assertEquals(Math.exp(2.5), Math.pow(Math.E, 2.5), delta); // e ^ x
assertEquals(Math.expm1(2), Math.exp(2) - 1, delta);  // e ^ x - 1
assertEquals(Math.log(Math.exp(1.5)), 1.5, delta); // ln(x)
assertEquals(Math.log10(1000), 3, delta);      // lg(x)
assertEquals(Math.log1p(Math.E - 1), 1, delta);   // ln(1 + x)

双曲函数

  • sinh(x): (e ^ x - e ^ -x) / 2
  • cosh(x): (e ^ x + e ^ -x) / 2
  • tanh(x): sinh(x) / cosh(x)
assertEquals(Math.sinh(2), (Math.exp(2) - Math.exp(-2)) / 2, delta);  // sinh(x) = (e ^ x - e ^ -x) / 2
assertEquals(Math.cosh(2), (Math.exp(2) + Math.exp(-2)) / 2, delta);  // cosh(x) = (e ^ x + e ^ -x) / 2
assertEquals(Math.tanh(2), Math.sinh(2) / Math.cosh(2), delta);     // tanh(x) = sinh(x) / cosh(x)

精确计算

普通的数值计算在溢出时是没有感知的,比如 Long.MAX_VALUE + 1 将得到结果 Long.MIN_VALUE,为了解决这种不合理,Math 提供了一些辅助函数,在结果溢出时将抛出异常

  • addExact(x, y): 加法
  • multiplyExact(x, y): 乘法
  • decrementExact(x, y): 递减
  • incrementExact(x, y): 递增
  • negateExact(x, y): 相反数
  • multiplyFull(x, y): 接受两个 int 返回一个 long,防止溢出
  • multiplyHigh(x, y): 返回两个 long 乘积的高 64 位
assertEquals(Long.MAX_VALUE + 1, Long.MIN_VALUE);                    // 溢出
assertThrows(ArithmeticException.class, () -> Math.addExact(Long.MAX_VALUE, 1));    // 加法溢出抛异常
assertThrows(ArithmeticException.class, () -> Math.multiplyExact(Long.MAX_VALUE, 2));  // 乘法
assertThrows(ArithmeticException.class, () -> Math.decrementExact(Long.MIN_VALUE));   // 递减
assertThrows(ArithmeticException.class, () -> Math.incrementExact(Long.MAX_VALUE));   // 递增
assertThrows(ArithmeticException.class, () -> Math.negateExact(Long.MIN_VALUE));    // 相反数
assertEquals(Math.addExact(1, 2), 3);
assertEquals(Math.multiplyExact(2, 3), 6);
assertEquals(Math.incrementExact(6), 7);
assertEquals(Math.decrementExact(6), 5);
assertEquals(Math.negateExact(-6), 6);

assertEquals(Math.multiplyFull(1, 2), 2);  // 接受两个 int 返回一个 long,防止溢出
assertEquals(Math.multiplyHigh(1, 2), 0);  // 返回两个 long 乘积的高 64 位

浮点数

任意两个浮点数之间都有无数个浮点数,因此大部分浮点数是无法表示的,只能选取一个最接近的,java 提供了一些接口来获取能表示的浮点数

System.out.println(Math.nextUp(1.1));  // 下一个浮点数
System.out.println(Math.nextDown(1.1)); // 上一个浮点数
System.out.println(Math.nextAfter(1.1, Double.POSITIVE_INFINITY));  // 下一个浮点数
System.out.println(Math.nextAfter(1.1, Double.NEGATIVE_INFINITY));  // 上一个浮点数

随机数

math 库随机数

System.out.println(Math.random());     // 0 ~ 1 之间的随机数

java.lang.Random

Random 类提供了更丰富的随机方法,可以返回各种不同类型的随机数

Random r = new Random();
System.out.println(r.nextInt());
System.out.println(r.nextLong());
System.out.println(r.nextFloat());
System.out.println(r.nextDouble());

Random 还提供了流式 api

Random r = new Random();
List<Integer> li = r.ints().limit(10).boxed().map((x) -> Math.abs(x % 100)).collect(Collectors.toList());
System.out.println(li);

java.util.Random 是线程安全的,但是,跨线程的同时使用 java.util.Random 实例可能会遇到争用,从而导致性能下降。在多线程设计中考虑使用java.util.concurrent.ThreadLocalRandom 代替 java.util.Random,ThreadLocalRandom 和 Random 拥有一致的接口

链接

Math 测试代码: https://github.com/hatlonely/hellojava/blob/master/src/test/java/util/MathTest.java
随机数测试代码: https://github.com/hatlonely/hellojava/blob/master/src/test/java/util/RandomTest.java

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java中的数学计算函数的总结

    java中的数学计算函数 Math类: java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(BigDecimal)算法的类. java.lang.Math类中包含E和PI两个静态常量,以及进行科学计算的类(static)方法,可以直接通过类名调用. public static final Double E = 2.7182818284590452354 public

  • java 数学计算的具体使用

    java.lang.Math 库提供了常用的数学计算工具 常量 final double E = 2.7182818284590452354; // 自然对数底数 final double PI = 3.14159265358979323846; // 圆周率 final double DEGREES_TO_RADIANS = 0.017453292519943295; // 角度转弧度 final double RADIANS_TO_DEGREES = 57.29577951308232; /

  • Java数学工具类MathUtil详解

    本文实例为大家分享了Java数学工具类MathUtil的具体代码,供大家参考,具体内容如下 package cn.xbz.util.math; import java.math.BigDecimal; /** * @title 数学计算工具类 * @description 提供常用的数值加减乘除计算 , 及多个数值的求和 , 平均值 , 最大最小值计算 */ public class XMathUtil { /** 默认的除法精确度 */ private static final int DEF

  • Java中计算时间差的方法

    本文实例讲述了Java中计算时间差的方法.分享给大家供大家参考.具体如下: 假设现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方法一: DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date d1 = df.parse("2004-03-26 13:31:40"); Date

  • 简单讲解Python中的数字类型及基本的数学计算

    Python有四种类型的数字: 1.整型 a = 2 print a 2.长整型 b = 123456789 print b 3.浮点数 c = 3.2E2 print c 4.复数 复数为实数的推广,它使任一多项式都有根.复数当中有个"虚数单位"j,它是-1的一个平方根.任一复数都可表达为x+yj,其中x及y皆为实数,分别称为复数之"实部"和"虚部". d = (2+3j) print d 计算示例: 每种程序语言都有数学计算方法,数学符号通用

  • java实现计算地理坐标之间的距离

    java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 复制代码 代码如下: package com.jttx.poi.utils; import com.jttx.poi.entity.Point; /**  * Created by louis on 2014/9/2.  */ public class GeoUtils {     /**      * 计算两经纬度点之间的距离(单位:米)      * @param lng1  经度      * @param lat1 

  • Java简单计算两个日期月数差的方法

    本文实例讲述了Java简单计算两个日期月数差的方法.分享给大家供大家参考,具体如下: /** * 获取两个日期相差的月数 * @param d1 较大的日期 * @param d2 较小的日期 * @return 如果d1>d2返回 月数差 否则返回0 */ public static int getMonthDiff(Date d1, Date d2) { Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInsta

  • Java简单计算圆周率完整示例

    本文实例讲述了Java简单计算圆周率.分享给大家供大家参考,具体如下: 这两天在网上看到一个题,已知Pi可以用函数4 * (1 – 1/3 + 1/5 – 1/7 + -) 计算,计算出小数点后五位(计算圆周率).于是手动写了一个小demo,欢迎大家留言,进行交流与指教. 完整示例代码如下: package math; public class PiTest { private static int bytelimit = 5;// 小数后限制位数 /** * @author zhao33699

  • Java解决计算相邻两个数的最大差值的问题

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O(N), 且要求不能用非基于比较的排序. 我查了一下,暂时没有找到一个在线OJ的链接,只能自己写一个对数器,手动测试了. 当初我看到这个题目的时候,说这怎么可能呢?在一个无序的数组中,求相邻两个数据的最大差值.可是我们都知道,现在基于比较的排序算法,最快也只能够达到O(N*logN)的水平,而题目明确

  • Java精确计算BigDecimal类详解

    引言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦. 先看下面代码 public static void main(String[] args) { System.out.println(0.2 + 0.1); System.out.printl

随机推荐