10

所以当像下面的陈述一样投射时: -

int randomNumber=(int) (Math.random()*5)

它会导致随机编号。生成以转换为 int..

还有这种方法我刚遇到 Integer.parseInt() 也有同样的效果!

即返回一个整数

为什么有两种不同的方法使值成为 int ?

我也进行了搜索,它说 parseInt() 将字符串作为参数。这是否意味着 parseInt() 只能将字符串转换为整数?

那么这个铸造怎么样(int)?我们也可以使用它来将字符串转换为 int 吗?

对不起,如果这听起来像一个愚蠢的问题..我只是很困惑并试图理解

帮助 ?

4

7 回答 7

24

Integer.parseInt 不做与演员相同的事情。

让我们看一下您的第一个示例:

int randomNumber=(int) (Math.random()*5)

Math.random 返回一个 double,当你将一个 double 乘以一个 int Java 时,它认为结果是一个 double。因此,表达式 Math.random()*5 具有 double 类型。您要做的是将该值分配给 int 类型的变量。默认情况下,如果您没有明确告诉编译器可以这样做,Java 将不允许您将 double 值分配给 int 类型的变量。基本上,您可以认为将 double 转换为 int 就像告诉编译器:“我知道这个 int 变量不能保存这个 double 值的小数部分,但没关系,只需截断它即可。”

现在看一下 String 到 int 的转换:

int value = Integer.parseInt("5");

字符串“5”不能立即转换为整数。与根据定义可以通过删除小数部分将其转换为整数的双精度数不同,字符串不能轻松或一致地转换为 int。“5”、“042”和“1,000”都有整数表示,但类似于“Hello, World!” 才不是。因此,没有将 String 转换为 int 的一阶语言功能。相反,您使用一种方法来解析字符串并返回值。

所以回答你所有的问题:

为什么有两种不同的方法使值成为 int ?

您必须考虑要转换的值的类型是什么。如果要将基元转换为 int,则可以使用强制转换;如果要转换 Object,则需要使用特定于该类型的某种转换方法。

我也进行了搜索,它说 parseInt() 将字符串作为参数。这是否意味着 parseInt() 只能将字符串转换为整数?

正确的。您不能将任何其他类型传递给 parseInt 方法,否则您将收到编译器错误。

那么这个铸造怎么样(int)?我们也可以使用它来将字符串转换为 int 吗?

不,转换为 int 仅适用于原始值,而在 Java 中,String 不是原始值。

于 2010-05-20T16:29:27.433 回答
4

在您的示例中,您将浮点数转换为 int。然而,Integer.parseInt() 从字符串中读取整数值。

于 2010-05-20T15:59:25.900 回答
3

您只能在兼容类型之间进行转换(我会链接到 JLS,但这对于初学者问题来说可能太多了)。

Casting 基本上只是取一个值并说,“嘿,这个东西是 double 吗?现在它是一个 int。所以就在那里。”

你不能用一个字符串来做到这一点,因为它不像一个 int。相反,您必须从中解析出一个 int,这实际上比听起来要困难得多。幸运的是,它已经为您实现了,因此您不必担心它是如何工作的。

于 2010-05-20T16:02:51.010 回答
1

强制转换只能从一种数字类型转换为另一种。解释字符串(也称为解析)需要通过方法调用来完成。

于 2010-05-20T15:59:35.120 回答
1

让我们从顶部开始。

int randomNumber=(int) (Math.random()*5);

是的,这确实给出了一个介于 0 和 4 之间的随机整数,但这并不是正确的做法。你看,如果你忘记了一个括号,即你输入

int notSoRandomNumber=(int) Math.random()*5;

你总是会得到 0 因为强制转换的优先级高于乘法。也就是说 Math.random() 的结果首先被强制转换成一个整数,这个整数永远是 0,然后乘以 5,仍然是 0。

我倾向于使用 java.util.Random 来生成随机整数。qv http://java.sun.com/javase/6/docs/api/java/util/Random.html#nextInt(int)

只能在“兼容类型”之间进行转换。对于原始类型及其包装器(即 int、Integer、long、Long 等),您始终可以在它们之间进行转换,但需要注意的是某些转换会丢失信息。例如,当将 long 转换为 int 时,long 可能包含大于 Integer.MAX_VALUE] 的数字。这种类型的转换 Java 基本上是从 C++ 得到的,而 C++ 又是从 C 得到的。

至于铸造对象,它实际上更简单。简单地问“这个物体,o,一个X吗?” 如果是这样,那么 (X) o 有意义并且具有静态类型 X。如果 o 不是 X 并且您尝试强制转换,您将得到一个 ClassCastException,表示 o 的动态(运行时)类型与 X 不兼容。这将稍后当您了解对象的静态和动态(运行时)类型之间的区别时,可能会更有意义。

于 2010-05-20T16:31:39.537 回答
0

以下代码将 String 转换为 int 没有任何方法

public class MyStringToNumber {

    public static int convert_String_To_Number(String numStr){

        char ch[] = numStr.toCharArray();
        int sum = 0;
        //get ascii value for zero
        int zeroAscii = (int)'0'; // '0'=48 zeroAscii=48
        for(int i=0;i<ch.length;i++){
            int tmpAscii = (int)ch[i]; // for 0  ch[i]=3,3=51, tempAscii=51
                                       //         (0*10)+(51-48)
                                       //         0     +3
                                       //         3
                                       //      sum=3
                                       // for 1  ch[i]=2,2=50, tempAscii=50            
            sum = (sum*10)+(tmpAscii-zeroAscii);  // 0 +(51-48)=3 sum=3
                                                  // (3*10)=30+(50-48)
                                                  //           30  +  2
                                                  //   sum=32
                                       // for 2  ch[i]=5, 5=53 tempAscii=53
                                       //         (32*10)+(53-48)
                                       //          320   + 5
                                       //          325     
                                       //  sum=325
                                      // for 3   ch[i]=6,6=54, tempAscii=54
                                      //         (325*10)+(54-48)
                                      //         3250 +6
                                     //         3256
                                     //    sum=3256
        }
        return sum;
    }

    public static void main(String a[]){

        System.out.println("\"3256\" == "+convert_String_To_Number("3256"));
    }
}

输出“3256”--> 3256

于 2017-05-16T06:47:13.297 回答
0
  1. Parse() 方法有多种格式,Integer 类有 ParseInt() 方法,这是一个静态方法,我们通过 Integer.ParseInt() 调用该方法

  2. 同样具有 ParseDouble() 的 Double 类,我们将其称为 Double.ParseDouble()。

  3. 更通用的方式是 XXXX.ParseXXXX()

  4. 此方法的主要用途是将任何 Object 转换为 Primitive。

  5. 在这里你可以提出一个问题,为什么我们需要转换成 Primitives?答案是,我们知道图元存储在栈区,对象存储在堆区,你不想浪费堆内存,你可以将对象转换为基元。

  6. 另一件事是,在访问任何对象时,可能会有开销。最好用作 Primitive。

于 2017-05-16T07:57:28.190 回答