Java 数字与 Math 类
在 Java 运算符 一节中我们已经介绍过一些简单的运算符号了, 比如 +, -, *, / 等.
同时在 Java 的基础数据类型 一节中, 我们也了解到, 所有的基础类型都有其封装类,如 Byte, Integer, Double 等.
以下是各种数字类型的, 对应的封装类的列表:
基础类型 | 对应的包装类 |
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
封装类提供了各种便捷的方法, 用于类型之间的转换, 同时也可以直接和对应的基础类型做直接运算.
示例代码如下:
package com.yi21.math; public class Yi21Math { public static void main(String[] args) { Integer i = 200; Float f = Float.valueOf("100.2"); long l = i.longValue(); byte b = f.byteValue(); System.out.println(f + " & " + b); System.out.println(f + 1); System.out.println(l / 2.0); } }
从上述代码中我们可以看到, 经过封装类的特殊方法(例如 Float.vlaueOf()
), 我们甚至可以将字符串转换成我们想要的数据类型.
基础类型的转换
除了上述的封装类型可以做数据类型转换以外, 我们还可以通过 (type) 值
的格式做显式基础类型的转换, 同时类型按容量大小的差异可以做隐式转换, 容量大小的排序如下: byte, short, char < int < long <float < double, 实际使用的代码示例如下:
double d = 10000; int i = (int) d; System.out.println(i); float f = (float) i; System.out.println(f); byte b = (byte) f; System.out.println(b); //隐式转换 double d2 = f; System.err.println(d2); int i2 = b; System.err.println(i2);
Math
类的使用
Math
类提供了进一步的针对数学方面的计算的支持. 这种支持不仅仅是提供了方法, 如 cos
(余弦), sin
(正弦), exp
(自然常数e的n次幂), min
(求最小值) 这些, 还提供了一些很常用的数学常量, 比如 PI
, 圆周率的值, E
自然常数的值.
Math
的完整名称是 java.lang.Math
, 因为是 java 自带方法, 所以无需使用完整的包名引入. 这一点和 String
, RuntimeException
等类似.
下面我们来看看一些常见的数学方法的使用示例, 具体方法的作用参见示例中的注释:
package com.yi21.math; public class Yi21Math3 { public static void main(String[] args) { //输出自然常数的值 System.out.println(Math.E); //输出自然常数的一次幂 等于 自然常数 System.out.println(Math.exp(1) == Math.E); //输出自然常数的二次幂 却不等于 自然常数 * 自然常熟, 参照结果我们发现是出现了精度丢失的问题 System.out.println(Math.exp(2) + " == " + Math.E * Math.E + " : " + (Math.exp(2) == Math.E * Math.E)); //用 Math.sin 一个角度的正弦, 结果不是 0.5 出现了精度丢失问题 //使用 Math.toRadians() 将角度的值转换为对应的小数 System.out.println(Math.sin(Math.toRadians(30))); //360° = 2 * PI 是一个正圆, 从圆心取一个30°的角就是 2 * PI / 12 = PI / 6 System.out.println(Math.sin(Math.PI / 6)); //结果也符合我们的预期 System.out.println(Math.sin(Math.toRadians(30)) == Math.sin(Math.PI / 6)); System.out.println("向下取整: " + Math.floor(3.54)); System.out.println("向上取整: " + Math.ceil(3.54)); System.out.println("向上取整2: " + Math.ceil(3.0)); System.out.println("四舍五入取整: " + Math.round(Math.PI)); System.out.println("-1 的绝对值: " + Math.abs(-1)); System.out.println("3 的平方根: " + Math.sqrt(3)); System.out.println("2 的 10 次方: " + Math.pow(2, 10)); System.out.println("100 和 10 哪个大? " + Math.max(100, 10)); } }
关于 Math 的更多用法, 请参见 Java 数学手册
下一节, 请看 Java 的时间和日期