Java数字处理全解析
立即解锁
发布时间: 2025-08-18 02:37:39 阅读量: 4 订阅数: 20 

### Java 数字处理全解析
在 Java 编程中,数字处理是一个基础且重要的部分。Java 提供了丰富的工具和方法来处理各种数字相关的任务,下面将详细介绍 Java 中数字处理的多个方面。
#### 1. Java 数字处理基础
Java 在数字处理方面有着强大的功能,致力于确保程序的可靠性。它通过要求捕获潜在异常以及在存储可能不适合变量的值时进行类型转换(“cast”)来实现这一点。
Java 的 `java.lang.Math` 类包含了一个完整的“数学库”,涵盖三角函数、转换(如度与弧度的转换)、四舍五入、截断、平方根、最小值和最大值等操作。同时,`java.Math` 包支持处理“大数字”,即比普通内置长整数更大的数字。
#### 2. 检查字符串是否为有效数字
在实际编程中,我们经常需要检查一个给定的字符串是否包含有效数字,并将其转换为二进制(内部)形式。可以使用适当的包装类的转换例程,并捕获 `NumberFormatException`。以下是将字符串转换为双精度浮点数的代码示例:
```java
// StringToDouble.java
public static void main(String argv[]) {
String aNumber = argv[0]; // not argv[1]
double result;
try {
result = Double.parseDouble(aNumber);
} catch(NumberFormatException exc) {
System.out.println("Invalid number " + aNumber);
return;
}
System.out.println("Number is " + result);
}
```
不过,这种方法只能验证包装类设计者预期格式的数字。如果需要接受不同定义的数字,可以使用正则表达式进行判断。另外,有时候我们想判断一个给定的数字是整数还是浮点数,一种方法是检查输入中是否包含字符 `.`、`d`、`e` 或 `f`,如果存在这些字符之一,则将数字转换为双精度浮点数,否则转换为整数:
```java
// Part of GetNumber.java
private static Number NAN = new Double(Double.NaN);
/* Process one String, returning it as a Number subclass
*/
public Number process(String s) {
if (s.matches(".*[.dDeEfF]")) {
try {
double dValue = Double.parseDouble(s);
System.out.println("It's a double: " + dValue);
return new Double(dValue);
} catch (NumberFormatException e) {
System.out.println("Invalid a double: " + s);
return NAN;
}
} else // did not contain . d e or f, so try as int.
try {
int iValue = Integer.parseInt(s);
System.out.println("It's an int: " + iValue);
return new Integer(iValue);
} catch (NumberFormatException e2) {
System.out.println("Not a number:" + s);
return NAN;
}
}
```
#### 3. 将大类型数字存储到小类型变量中
当我们有一个大类型的数字并想将其存储到小类型的变量中时,需要进行类型转换(cast)。例如,将长整型转换为整型,将双精度浮点数转换为单精度浮点数都需要进行类型转换。
以下代码展示了类型转换的情况:
```java
// CastNeeded.java
public static void main(String argv[]) {
int i;
double j = 2.75;
i = j; // EXPECT COMPILE ERROR
i = (int)j; // with cast; i gets 2
System.out.println("i =" + i);
byte b;
b = i; // EXPECT COMPILE ERROR
b = (byte)i; // with cast, i gets 2
System.out.println("b =" + b);
}
```
需要注意的是,标记为 `EXPECT COMPILE ERROR` 的行如果不注释或修改将无法编译,而标记为“with cast”的行展示了正确的形式。
#### 4. 数字与对象的相互转换
在 Java 中,我们有时需要将数字转换为对象,或者将对象转换为数字。可以使用对象包装类来实现这一点。在 Java 1.4 及更早版本中,使用集合类时,经常需要将基本数字类型转换为对象。例如,在 `IntObject.java` 中,展示了 `int` 与 `Integer` 对象之间的相互转换:
```java
// IntObject.java
// int to Integer
Integer i1 = new Integer(42);
System.out.println(i1.toString( )); // or just i1
// Integer to int
int i2 = i1.intValue( );
System.out.println(i2);
```
#### 5. 不使用浮点数计算整数的分数
有时候,为了提高效率,我们希望在不将分数转换为浮点数的情况下将整数乘以一个分数。可以通过将整数乘以分子并除以分母来实现。不过这种技术在效率比代码清晰度更重要时使用,因为它会降低代码的可读性和可维护性。
以下是一个计算 `2/3` 乘以 `5` 的示例代码:
```java
/** Compute the value of 2/3 of 5 */
public class FractMult {
public static void main(String u[]) {
double d1 = 0.666 * 5; // fast but obscure and inaccurate: convert
System.out.println(d1); // 2/3 to 0.666 in programmer's head
double d2 = 2/3 * 5; // wrong answer - 2/3 == 0, 0*5 = 0
System.out.println(d2);
double d3 = 2d/3d * 5; // "normal"
System.out.println(d3);
double d4 = (2*5)/3d; // one step done as integers, almost same answer
System.out.println(d4);
int i5 = 2*5/3; // fast, approximate integer answer
System.out.println(i5);
}
}
```
运行结果如下:
```
$ java FractMult
3.33
0.0
3.333333333333333
3.3333333333333335
3
$
```
#### 6. 确保浮点数计算的准确性
在进行浮点数计算时,我们需要知道计算结果是否合理。可以通过与 `INFINITY` 常量进行比较,并使用 `isNaN()` 方法来检查是否为“非数字”(NaN)。
以下代码展示了如何使用这些方法:
```java
// InfNaN.java
public static void main(String argv[]) {
double d = 123;
double e = 0;
if (d/e == Double.POSITIVE_INFINITY)
System.out.println("Check for POSITIVE_INFINITY works");
double s = Math.sqrt(-1);
if (s == Double.NaN)
System.out.println("Comparison with NaN incorrectly returns true");
if (Double.isNaN(s))
System.out.println("Dou
```
0
0
复制全文
相关推荐










