杰瑞科技汇

Java中double转int有哪些方法?

核心要点

在开始之前,请务必记住 doubleint 的关键区别:

Java中double转int有哪些方法?-图1
(图片来源网络,侵删)
  • double:是浮点数类型,可以存储小数(5),它的范围比 int 大得多。
  • int:是整数类型,只能存储整数(10),范围较小。

double 转为 int 必然会丢失小数部分,这个过程在 Java 中被称为截断,而不是四舍五入。


强制类型转换(Casting)

这是最直接、最常用的方法,使用一对圆括号 将目标类型 int 包裹起来,放在需要转换的 double 变量前面。

语法

int intValue = (int) doubleValue;

行为

直接丢弃小数部分,只保留整数部分,这被称为截断

示例

public class DoubleToIntExample {
    public static void main(String[] args) {
        double positiveDouble = 99.89;
        double negativeDouble = -99.89;
        double doubleWithFraction = 50.0; // 小数部分为0
        // 强制类型转换
        int intFromPositive = (int) positiveDouble;
        int intFromNegative = (int) negativeDouble;
        int intFromWhole = (int) doubleWithFraction;
        System.out.println("原始 double 值: " + positiveDouble);
        System.out.println("强制转换后的 int 值: " + intFromPositive); // 输出 99
        System.out.println("\n原始 double 值: " + negativeDouble);
        System.out.println("强制转换后的 int 值: " + intFromNegative); // 输出 -99
        System.out.println("\n原始 double 值: " + doubleWithFraction);
        System.out.println("强制转换后的 int 值: " + intFromWhole);    // 输出 50
    }
}

输出结果:

Java中double转int有哪些方法?-图2
(图片来源网络,侵删)
原始 double 值: 99.89
强制转换后的 int 值: 99
原始 double 值: -99.89
强制转换后的 int 值: -99
原始 double 值: 50.0
强制转换后的 int 值: 50

注意: 即使 89 更接近 100,强制转换的结果仍然是 99,它不会进行四舍五入。


使用 Math 类的方法

如果你希望在转换前对小数部分进行四舍五入,可以使用 java.lang.Math 类中的方法。

Math.round()

这是最常用的方法,用于实现标准的“四舍五入”。

  • 行为:将 double 四舍五入到最接近的 long 整数值,然后你可以再将 long 赋值给 int
  • 注意Math.round() 的返回值是 long 类型,而不是 int,因为 double 的范围可能超出 int 的范围,所以返回一个更大的类型 long 是更安全的。

语法

int intValue = (int) Math.round(doubleValue);

示例

public class MathRoundExample {
    public static void main(String[] args) {
        double d1 = 99.49; // 小数部分 < 0.5,应舍去
        double d2 = 99.50; // 小数部分 >= 0.5,应进一
        double d3 = -99.49; // 绝对值的小数部分 < 0.5,应舍去
        double d4 = -99.50; // 绝对值的小数部分 >= 0.5,应舍去(向绝对值小的方向舍入)
        // 使用 Math.round() 进行四舍五入
        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); // 输出 -99 (注意:-99.5 四舍五入是 -99)
    }
}

输出结果:

Java中double转int有哪些方法?-图3
(图片来源网络,侵删)
原始值: 99.49, 四舍五入后: 99
原始值: 99.5, 四舍五入后: 100
原始值: -99.49, 四舍五入后: -99
原始值: -99.5, 四舍五入后: -99

Math.floor()Math.ceil()

这两个方法也常用于转换,但它们的行为更特殊。

  • Math.floor(double a)向下取整,返回小于或等于 a 的最大整数(以 double 形式返回)。
    • Math.floor(99.9) -> 0
    • Math.floor(-99.1) -> -100.0 (注意是向负无穷方向取整)
  • Math.ceil(double a)向上取整,返回大于或等于 a 的最小整数(以 double 形式返回)。
    • Math.ceil(99.1) -> 0
    • Math.ceil(-99.9) -> -99.0 (注意是向正无穷方向取整)

使用它们时也需要先转换为 double,然后再强制转换为 int

double d = 99.9;
int floorValue = (int) Math.floor(d); // 结果为 99
int ceilValue = (int) Math.ceil(d);   // 结果为 100

总结与对比

方法 语法 行为 返回类型 适用场景
强制类型转换 (int) myDouble 截断:直接丢弃小数部分,只保留整数部分。 int 当你明确只想丢弃小数部分时,例如处理像素坐标、计算页数等。
Math.round() (int) Math.round(myDouble) 四舍五入:将小数部分四舍五入到最接近的整数。 long 当你需要最标准的四舍五入运算时。这是最常见的四舍五入需求。
Math.floor() (int) Math.floor(myDouble) 向下取整:向负无穷方向取整。 double 当你需要一个不大于原数的最大整数时,例如计算商品价格的下限。
Math.ceil() (int) Math.ceil(myDouble) 向上取整:向正无穷方向取整。 double 当你需要一个不小于原数的最小整数时,例如计算需要多少个箱子来装东西。

重要注意事项

  1. 数据范围溢出double 的数值范围远大于 int,如果一个 double 值超出了 int 的表示范围(0e30),强制转换为 int 会导致一个不明确的、不可预测的结果,而不是抛出异常,在进行转换前,最好先检查数值是否在 int 的范围内。

    double largeDouble = 1.0e20; // 10的20次方
    int result = (int) largeDouble; // 结果是 2147483647 (Integer.MAX_VALUE),发生了溢出
    System.out.println(result);
  2. NaNInfinity

    • double 值是 NaN (Not a Number),强制转换为 int 的结果是 0
    • double 值是 POSITIVE_INFINITYNEGATIVE_INFINITY,强制转换为 int 的结果是 Integer.MAX_VALUEInteger.MIN_VALUE

最佳实践

  • 如果只想丢弃小数部分:使用 强制类型转换 (int),它最高效且意图明确。
  • 如果需要进行四舍五入:使用 Math.round(),这是最标准、最不容易出错的做法。
  • 在转换前检查数值范围:如果处理的 double 值可能非常大,请务必检查它是否在 Integer.MIN_VALUEInteger.MAX_VALUE 之间,以避免潜在的溢出问题。
分享:
扫描分享到社交APP
上一篇
下一篇