【问题标题】:Why is scan.nextFloat() not reading only float values?为什么 scan.nextFloat() 不只读取浮点值?
【发布时间】:2017-02-26 22:24:45
【问题描述】:

我试图从包含整数和浮点值的文件中仅读取浮点值,但是当我执行 scan.nextFloat() 时,它仍会读取下一个整数值并将其转换为浮点数并将其添加到我的点列表中。下面是我正在做的事情。

while(scan.hasNextFloat()) {
     points.add(scan.nextFloat());
} 

文件中的样本点

3 4

3.3 4 5

2.3 3 3

有没有办法从文件中读取浮点值,例如 3.3 和 2.3。也不应该 scan.nextFloat() 在跳过 int 值时只读取浮点值吗?

【问题讨论】:

  • "不应该 scan.nextFloat() 在跳过 int 值时只读取浮点值" -- 扫描器仅在明确告知时才跳过,它不会神奇地决定你要跳过的内容。此外,没有小数点的数字是有效的浮点数。如果您想忽略整数,则必须显式编码以忽略它们。
  • 知道了,谢谢!

标签: java java.util.scanner


【解决方案1】:

您几乎必须接受nextFloat 会将像 3 这样的数字读作 3.0。如果您不想要整数的数字,那么在您阅读它们之后将它们过滤掉。 (请参阅其他答案。)但是,如果您想包含“3.0”而不是“3”,那么您必须将值作为字符串读取,并且只解析具有小数的值:

while (scan.hasNext()) {
   String s = scan.next();
   if (s.indexOf('.') != -1) {
       double d = Double.parseDouble(s);
       // do something with d...
   }
}

【讨论】:

    【解决方案2】:

    根据docshasNextFloat()方法:

    如果此扫描器输入中的下一个标记可以使用 nextFloat() 方法解释为浮点值,则返回 true

    nextFloat() 声明(强调我的):

    (...) 如果下一个标记与上面定义的 Float 正则表达式匹配,则该标记被转换为浮点值,就像通过删除所有区域设置特定的前缀、组分隔符和区域设置特定的后缀,然后映射非 ASCII 数字通过 Character.digit 转换为 ASCII 数字,如果存在特定于语言环境的负前缀和后缀,则在前面加上负号 (-),并将结果字符串传递给 Float.parseFloat。如果令牌与本地化的 NaN 或无穷大字符串匹配,则“Nan”或“Infinity”将酌情传递给 Float.parseFloat。

    另一方面,Float 可以是 Decimal、HexFloat 或 SignedNonNumber。 Decimal 可以是 DecimalNumeral,也可以是 Numeral,也可以是数字。

    这就是为什么。

    另一种只取浮点值的方法是(如果你的文件当然只包含整数和浮点数):

    while(scan.hasNext() && !scan.hasNextInt()) {
     points.add(scan.nextFloat());
    

    }

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 2020-09-26
      • 2020-05-13
      • 1970-01-01
      • 2018-03-02
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      相关资源
      最近更新 更多