杰瑞科技汇

Java double转integer如何取舍精度?

转换过程必然涉及到如何处理小数部分,Java 提供了多种方式来实现这个转换,每种方式都有其特定的行为和适用场景。

Java double转integer如何取舍精度?-图1
(图片来源网络,侵删)

下面我将详细介绍最常用的几种方法,并附上代码示例和解释。


强制类型转换(Type Casting) - (int)

这是最直接、最快速的方法,它会直接截断 double 的小数部分,只保留整数部分。

特点:

  • 截断,而非四舍五入:它会无条件地丢弃小数部分,而不是四舍五入。
  • 不进行范围检查double 的值超出了 int 的表示范围(-2,147,483,6482,147,483,647),转换结果会是一个错误的值,而不会抛出异常,这可能会导致难以发现的 bug。

示例代码:

Java double转integer如何取舍精度?-图2
(图片来源网络,侵删)
public class DoubleToInt {
    public static void main(String[] args) {
        double positiveDouble = 99.89;
        double negativeDouble = -99.89;
        double largeDouble = 1.2e10; // 12,000,000,000,超出了int的范围
        double doubleWithZeroFraction = 100.0;
        // 使用强制类型转换 (int)
        int int1 = (int) positiveDouble;
        int int2 = (int) negativeDouble;
        int int3 = (int) largeDouble;
        int int4 = (int) doubleWithZeroFraction;
        System.out.println("原始值: " + positiveDouble + " -> 转换后: " + int1); // 输出: 99
        System.out.println("原始值: " + negativeDouble + " -> 转换后: " + int2); // 输出: -99
        System.out.println("原始值: " + largeDouble + " -> 转换后: " + int3); // 输出: -147483648 (错误的结果!)
        System.out.println("原始值: " + doubleWithZeroFraction + " -> 转换后: " + int4); // 输出: 100
    }
}

何时使用: 当你明确地只想丢弃小数部分,并且可以确定 double 的值在 int 的安全范围内时使用。


使用 Math.round() - 四舍五入

如果你想将 double 四舍五入到最接近的整数,应该使用 Math.round() 方法。

特点:

  • 四舍五入:它会根据小数部分进行四舍五入。
  • 返回值类型Math.round(double) 的返回值是 long 类型,而不是 int,如果需要 int,还需要进行一次强制类型转换。
  • 不进行范围检查:和强制转换一样,如果值超出范围,结果也是错误的。

示例代码:

Java double转integer如何取舍精度?-图3
(图片来源网络,侵删)
public class DoubleToIntRound {
    public static void main(String[] args) {
        double d1 = 99.49; // 应该向下取整
        double d2 = 99.50; // 应该向上取整
        double d3 = -99.49; // 应该向上取整 (向0)
        double d4 = -99.50; // 应该向下取整 (远离0)
        // Math.round() 返回 long,需要再强制转换为 int
        int i1 = (int) Math.round(d1);
        int i2 = (int) Math.round(d2);
        int i3 = (int) Math.round(d3);
        int i4 = (int) Math.round(d4);
        System.out.println("原始值: " + d1 + " -> 四舍五入后: " + i1); // 输出: 99
        System.out.println("原始值: " + d2 + " -> 四舍五入后: " + i2); // 输出: 100
        System.out.println("原始值: " + d3 + " -> 四舍五入后: " + i3); // 输出: -99
        System.out.println("原始值: " + d4 + " -> 四舍五入后: " + i4); // 输出: -100
    }
}

何时使用: 当你需要将一个浮点数按照数学上的四舍五入规则转换为最接近的整数时使用。


使用 Math.floor() - 向下取整

Math.floor() 会返回小于或等于该 double 值的最大整数。

特点:

  • 向下取整(地板):对于正数,是直接去掉小数;对于负数,是向更小的整数取。
  • 返回值类型Math.floor(double) 的返回值是 double,你需要再使用强制类型转换 (int) 来得到 int 值。
  • 不进行范围检查

示例代码:

public class DoubleToIntFloor {
    public static void main(String[] args) {
        double d1 = 99.99;
        double d2 = -99.99;
        // Math.floor() 返回 double,需要再强制转换为 int
        int i1 = (int) Math.floor(d1);
        int i2 = (int) Math.floor(d2);
        System.out.println("原始值: " + d1 + " -> 向下取整后: " + i1); // 输出: 99
        System.out.println("原始值: " + d2 + " -> 向下取整后: " + i2); // 输出: -100
    }
}

何时使用: 当你需要将一个数“向下”取整时,例如在计算分页总数等场景中。


使用 Math.ceil() - 向上取整

Math.ceil() 会返回大于或等于该 double 值的最小整数。

特点:

  • 向上取整(天花板):对于正数,是向更大的整数取;对于负数,是直接去掉小数。
  • 返回值类型Math.ceil(double) 的返回值是 double,你需要再使用强制类型转换 (int) 来得到 int 值。
  • 不进行范围检查

示例代码:

public class DoubleToIntCeil {
    public static void main(String[] args) {
        double d1 = 99.01;
        double d2 = -99.01;
        // Math.ceil() 返回 double,需要再强制转换为 int
        int i1 = (int) Math.ceil(d1);
        int i2 = (int) Math.ceil(d2);
        System.out.println("原始值: " + d1 + " -> 向上取整后: " + i1); // 输出: 100
        System.out.println("原始值: " + d2 + " -> 向上取整后: " + i2); // 输出: -99
    }
}

何时使用: 当你需要将一个数“向上”取整时,例如在计算需要多少个箱子来装物品的场景中。


总结与最佳实践

方法 行为 返回类型 范围检查 适用场景
(int) 截断(直接丢弃小数) int 明确要丢弃小数,且值在安全范围内
Math.round() 四舍五入 long 需要按照数学规则四舍五入到最近整数
Math.floor() 向下取整(地板) double 需要向绝对值更小的方向取整
Math.ceil() 向上取整(天花板) double 需要向绝对值更大的方向取整

⚠️ 重要警告:处理超出范围的值

如上所述,以上所有方法都不会检查数值是否超出 int 的范围,如果这是一个潜在的风险,你应该先进行检查。

public class SafeDoubleToInt {
    public static void main(String[] args) {
        double largeDouble = 2.147483648e9; // 比 Integer.MAX_VALUE 大
        // 安全的转换方式
        if (largeDouble >= Integer.MIN_VALUE && largeDouble <= Integer.MAX_VALUE) {
            int result = (int) largeDouble;
            System.out.println("安全转换结果: " + result);
        } else {
            System.out.println("数值超出 int 范围,无法安全转换!");
            // 或者可以抛出异常
            // throw new ArithmeticException("Double value
分享:
扫描分享到社交APP
上一篇
下一篇