import java.util.* ;
public class ScannerDemo03{
public static void main(String args[]){
Scanner scan = new Scanner(System.in) ; // 从键盘接收数据
float f = 0.0f ;
System.out.print("输入小数:") ;
if(scan.hasNextFloat()){ // 判断输入的是否是小数
f = scan.nextFloat() ; // 接收小数
System.out.println("小数数据:" + f) ;
}else{
System.out.println("输入的不是小数!") ;
}
}
}; 
代码如上  :
问题是 1.  if里的判断条件判断输入的若是小数的话,则f接收并输出。     但是如果输入的是整型的话 比如2 则也可以输出2.0 这是什么问题- - 它不应该输出的是else里的 “输入的不是小数”吗。   是不是hasNextFloat 方法也可以接收整型数据呢。 
       2.   有的资料说 浮点型数据一定要带小数点,有的说 浮点数可以只是整型的,不带小数点的, 也可以由带小数点的。很迷惑。 求高手指点迷津哈 感激不尽。

解决方案 »

  1.   

    这两个问题,实际上是一个问题。int是可以自动向上转型为double的。
    就好比商品标价2元,也一样可以说成标价为2.0元。这样精度更高了。
      

  2.   

    float范围比int的要大,所有你输入2的时候也可以被默认为是一个float
      

  3.   

    float精度要比int高
    你应该反过来判断import java.util.*;public class ScannerDemo {
    public static void main(String args[]) {
    Scanner scan = new Scanner(System.in); // 从键盘接收数据
    float f = 0.0f;
    System.out.print("输入小数:");
    if (scan.hasNextInt()) { 
    System.out.println("输入的不是小数!");
    } else {
    System.out.println("小数数据:" + scan.next());
    }
    }
    };
      

  4.   


    public static void main(String args[]) {
    Scanner scan = new Scanner(System.in);
    System.out.print("输入小数:");
    if (scan.hasNextInt()) {//不是整数的也不一定是小数
    System.out.println("输入的不是小数!");
    } else if(scan.hasNextDouble()){
    System.out.println("小数数据:" + scan.hasNextDouble());
    } else {
    System.out.println("输入的不是小数!");
    }
    }
    其实用这个判断还是不够准确的,因为你不管用double还是float都是有一个范围的
    最好是当做一个字符串读入,用正则表达式去判断
    public static void main(String args[]) {
    Scanner scan = new Scanner(System.in);
    System.out.print("输入小数:");
    String str = scan.nextLine();
    Pattern p = Pattern.compile("(\\d|([1-9]\\d*))\\.\\d*");
    Matcher m = p.matcher(str);
    if(m.matches()) {
    System.out.println("小数数据:" + str);
    } else {
    System.out.println("输入的不是小数!");
    }
    }
      

  5.   

    个人理解有所不同。
    对于Scanner的 hasNextXXX方法,
    我觉得,应该是说,下一个字符串中,有没有能够被转化成该类型的数据。
    比如说:hasNextInt(),是说被扫描的当前字符序列中,
        当前位置后,是否紧邻一个能被转换成整型数据的字符序列。存在返回true。
    当然:hasNextFloat()方法,也就是说,当前位置后,是否紧邻一个能被转换成浮点数的字符序列。
        字符序列"20"很显然能被转换成浮点数,20.0所以,当然返回true咯。
      

  6.   

    觉得5楼的说法比较有理哈, 我问一下另一个问题。在扫描一个文件时, 用while(sc.hasNext()){str.append(sc.next()).append("\n");} system.out.println(str); 当这个文件里面的内容是有空格分开的几句话。那while是怎么判断输出的, 整个过程给详细的讲下哈,迷惑中。感激不尽。sc.hasNext()的工作原理是怎么样的。