大家不要重复造轮子,也不要自己随便写一些数据类型相加的方法,直接使用java.lang.Math的常用的一些运算方法。
举个例子,
public class AddExactDemo {
public static void main(String[] args) {
long a = Long.MAX_VALUE / 2 + 1;
long b = Long.MAX_VALUE / 2 + 1;
System.out.println(a + b);
System.out.println(Math.addExact(a, b));
}
}
long基础数据类型范围是[-9223372036854775808, 9223372036854775807],上面a+b刚好超过long类型的值域范围,最大值加1得到-9223372036854775808(转换为二进制加1,首位0表示正数,1表示负数)
使用java.lang.Math
的addExact
方法数据溢出后会抛出ArithmeticException
异常。源码如下,
public static long addExact(long x, long y) {
long r = x + y;
// HD 2-12 Overflow iff both arguments have the opposite sign of the result
if (((x ^ r) & (y ^ r)) < 0) {
throw new ArithmeticException("long overflow");
}
return r;
}
其中,x与x+y之和按位异或运算,y与x+y之和按位异或运算,最后将两者按位与运算如果小于0则抛出ArithmeticException
异常。
^ 、& 和 && 的区别
^:异或运算符,比特位相同则作为0,不同则为1。
& 和 && 均表示逻辑与运算
&:运算符两边的表达式都为true时才会返回true,否则返回false
&&:只要前面的表达式为false,后面的表达式就不会再被执行
java语言中,8大基础数据类型值域范围如下,
数据类型 | 占用大小 | 值域范围 |
---|---|---|
byte | 1字节 | [-128, 127] |
short | 2字节 | [-32768, 32767] |
int | 4字节 | [-2147483648, 2147483647] |
long | 8字节 | [-9223372036854775808, 9223372036854775807] |
char | 2字节 | [0, 65535] |
float | 4字节 | [1.4e-45f, 3.4028235E38f] |
double | 8字节 | [4.9e-324, 1.7976931348623157e+308] |
boolean | 1bit | {true, false} |
在java中,char使用指定编码方式占用的字节大小不同。通常gbk/gb2312是2个字节,utf-8是3个字节。
官方文档:java8_doc_Math
public static double sin(double a)
返回一个角度的正弦值,参数a代表的是弧度
public static double cos(double a)
返回一个角度的余弦值,参数a代表的是弧度
public static double tan(double a)
返回一个角度的正切值,参数a代表的是弧度
public static double asin(double a)
返回一个角度的反正弦值,参数a代表的是弧度
public static double acos(double a)
返回一个角度的反余弦值,参数a代表的是弧度
public static double atan(double a)
返回一个角度的反正切值,参数a代表的是弧度
public static double toRadians(double angdeg)
将以度为单位测量的角度转换为以弧度测量的近似等效角度。从度到弧度的转换通常是不精确的
public static double toDegrees(double angrad)
将以弧度测量的角度转换为以度为单位的大致相等的角度。从弧度到度的转换通常是不精确的;用户不应该期望完全相等
public static double atan2(double y, double x)
用于将矩形坐标 (x, y) 转换成极坐标 (r, theta),返回所得角 theta。该方法通过计算 y/x 的反正切值来计算相角 theta,范围为[-pi, pi]。
public static double sinh(double x)
返回双曲正弦值。 x的双曲正弦被定义为 (e^x - e^-x)/2其中e是欧拉数
public static double cosh(double x)
返回双曲余弦值。x的双曲余弦定义为(e ^x + e^ -x)/ 2,其中e是欧拉数
public static double tanh(double x)
返回双曲正切值。x的双曲正切定义为(e^ x - e^ -x)/(e^x + e^ -x),换句话说,sinh(x) / cosh(x)。请注意,精确tanh的绝对值始终小于1
public static double sqrt(double a)
此方法返回一个正平方根。如果参数是NaN或小于为零,那么结果为NaN
public static double cbrt(double a)
此方法返回一个正立方根
public static double hypot(double x, double y)
返回sqrt(x^2+ y^2),没有中间溢出或下溢
public static double log(double a)
取自然对数e为底的对数
public static double log1p(double x)
返回参数和1的和的自然对数
public static double pow(double a, double b)
返回a的b次方
public static double exp(double a)
用于返回自然数底数e的参数次方
public static double log10(double a)
取自然对数10为底的对数
public static double expm1(double x)
返回e^x-1
public static double scalb(double d, int s)
返回d × 2 ^ s 舍入,就像由单个正确舍入的浮点乘以双值集的成员一样
public static float scalb(float f, int s)
返回d × 2 ^ s 舍入,就像由单个正确舍入的浮点乘以浮点值集的成员一样
public static int getExponent(float f)
返回在f的表示中使用的无偏指数,对于浮点数。这个数字的范围是 [-125, 127],对于双精度数,这个数字的范围是 [-1022, 1023](Inf 和 NaN 为 +128/+1024)(就是求2的多少次方最接近d,比如getExponent(3.4028235E38f) = 127)
public static int getExponent(double d)
返回在f的表示中使用的无偏指数。对于浮点数,这个数字的范围是 [-125, 127],对于双精度数,这个数字的范围是 [-1022, 1023](Inf 和 NaN 为 +128/+1024)。(就是求2的多少次方最接近d)
public static double IEEEremainder(double f1, double f2)
根据IEEE 754标准对两个参数计算余数操作
public static double ceil(double a)
返回大于等于参数x的最小整数,即对浮点数向上取整
public static double floor(double a)
返回小于等于x的最大整数,即对浮点数向上取整
public static double rint(double a)
返回最接近参数的整数,如果有2个数同样接近,则会返回偶数的那个
public static int round(float a)
返回一个最接近参数的值(四舍五入)
public static long round(double a)
返回一个最接近参数的值(四舍五入)
public static double random()
选取大于等于 0.0 且小于 1.0 的伪随机 double 值
public static int addExact(int x, int y)
返回其参数的总和,如果结果溢出,则抛出异常
public static long addExact(long x, long y)
返回其参数的总和,如果结果溢出a则抛出异常
public static int subtractExact(int x, int y)
返回参数的差值,如果结果溢出则抛出异常。
public static long subtractExact(long x, long y)
返回参数的差值,如果结果溢出a则抛出异常
public static int multiplyExact(int x, int y)
返回参数的乘积,如果结果溢出则抛出异常
public static long multiplyExact(long x, long y)
返回参数的乘积,如果结果溢出a则抛出异常
public static int incrementExact(int a)
返回参数以1递增的值,如果结果溢出,则抛出异常
public static long incrementExact(long a)
返回参数以1递增的值,如果结果溢出,则抛出异常
public static int decrementExact(int a)
返回参数减1的值,如果结果溢出则抛出异常
public static long decrementExact(long a)
返回参数减1的值,如果结果溢出则抛出异常
public static int negateExact(int a)
改变参数符号,结果溢出时抛出ArithmeticException 异常
public static long negateExact(long a)
改变参数符号,结果溢出时抛出ArithmeticException 异常
public static int toIntExact(long value)
把指定long转化为int值反回
public static int floorDiv(int x, int y)
第一个参数除以第二参数,然后针对结果执行floor操作,返回小于或等于商的整数(最接近正无穷大)
public static long floorDiv(long x, long y)
第一个参数除以第二参数,然后针对结果执行floor操作,返回小于或等于商的整数(最接近正无穷大)
public static int floorMod(int x, int y)
第一个参数和第二个参数取模(x%y),然后对结果执行floor
public static long floorMod(long x, long y)
第一个参数和第二个参数取模(x%y),然后对结果执行floor
public static int abs(int a)
返回值的绝对值
public static long abs(long a)
返回值的绝对值
public static float abs(float a)
返回值的绝对值
public static double abs(double a)
返回值的绝对值
public static int max(int a, int b)
返回两个值中较大的一个
public static long max(long a, long b)
返回两个值中较大的一个
public static float max(float a, float b)
返回两个值中较大的一个
public static double max(double a, double b)
返回两个值中较大的一个
public static int min(int a, int b)
返回两个值中较大的一个
public static long min(long a, long b)
返回两个值中较大的一个
public static float min(float a, float b)
返回两个值中较大的一个
public static double min(double a, double b)
返回两个值中较大的一个
public static double ulp(double d)
返回一个数字和距其最近的数字之间的距离 详情
public static float ulp(float f)
返回一个数字和距其最近的数字之间的距离详情
public static double nextAfter(double start, double direction)
返回第二个参数方向上第一个参数旁边的浮点数
如果 direction大于 start,则 nextAfter()返回在 start之上的下一个数字。如果 direction小于 start,则 nextAfter()返回在 start之下的下一个数字。如果 direction等于 start,则 nextAfter()返回 start本身
public static float nextAfter(float start, double direction)
返回第二个参数方向上第一个参数旁边的浮点数
如果 direction大于 start,则 nextAfter()返回在 start之上的下一个数字。如果 direction小于 start,则 nextAfter()返回在 start之下的下一个数字。如果 direction等于 start,则 nextAfter()返回 start本身
public static double nextUp(double d)
返回比第一个参数大的最近浮点数
public static float nextUp(float f)
返回比第一个参数大的最近浮点数
public static double nextDown(double d)
返回负无穷大方向附近的浮点值(返回比第一个参数小的最近浮点数)
public static float nextDown(float f)
返回d负无穷大方向附近的浮点值(返回比第一个参数小的最近浮点数)
public static double signum(double d)
返回参数的signum函数; 如果参数为零,则返回零;如果参数大于零,则返回1.0;如果参数小于零,则返回-1.0
public static float signum(float f)
返回参数的signum函数; 如果参数为零,则返回零;如果参数大于零,则返回1.0;如果参数小于零,则返回-1.0
public static double copySign(double magnitude, double sign)
返回第二个浮点参数符号的第一个浮点参数
(如:copySign(10.58, 8) 返回:10.58)
(如:copySign(10.58, -8) 返回:-10.58)
public static float copySign(float magnitude, float sign)
返回带有第二个浮点参数符号的第一个浮点参数