【问题标题】:It works with int but not with double它适用于 int 但不适用于 double
【发布时间】:2018-06-14 21:22:48
【问题描述】:

以下程序按应有的方式工作(它从流中获取单词并设置最长和最短的 String.length 值(最大值和最小值))

String s;
int max = 0;
int min = Integer.MAX_VALUE;
int words = 0;
int totallength = 0;
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
    s = in.next();
    words++;
    int length = s.length();
    totallength += length;
    if(length > max) {
        max = length;
    }

    if(length < min) {
        min = length;
    }
}

System.out.println("max: " + max);
System.out.println("med: " + totallength/words);
System.out.println("min: " + min);

但函数 med(单词的平均长度)仅在它是 int 类型(部分无用)时才返回结果。 如果我将其设置为双精度:

double med = (double)totallength/(double)words;
System.out.println("max: " + max);
System.out.println("med: " + med);
System.out.println("min: " + min);

它只打印“最大值”并且程序停止。为什么会这样?

附:流被插入控制台,并以快捷键 Ctrl+C 或 Ctrl+D 结束,具体取决于操作系统

一些例子:

1
22
333
4444
max: 4

hello
helloo    hello
max: 6

the program does

does not work
for some reason
max: 7

【问题讨论】:

  • 我已经更正了您代码中的一个错字,该错字会阻止它编译。如果我做错了,请把它改过来。
  • 谢谢我注意到了,如果有拼写错误是因为我很快从另一种语言翻译了它
  • 没有崩溃,它只打印最大值,而不是其他两个打印。如果我在使用双精度时删除“医学打印”,它不会停止并打印最小值,所以这是使用双精度的错误,但我无法理解
  • 似乎为我打印了med(尽管intdouble 可以预见地给出不同的除法结果)-> ideone.com/20uFti
  • 啊,那是@Carcigenicate,不是我

标签: java double


【解决方案1】:

将您的Scanner 改为:

while(true) {
  s = in.nextLine();
  if(s.isEmpty())
    break;

我认为问题在于,当您想要结束输入流时,您实际上是在中断您的程序,之后行为变得不可预测。正如您所看到的,对某些人来说,您的程序运行良好,但对您(对我也是)却不行。如果你把它改成我的版本,扫描仪读取将在空行后结束。

【讨论】:

  • 有效!谢谢,你知道什么会导致这种行为吗?除了这样打断程序,我还能做些什么吗?
  • 这是因为您在尝试中断扫描仪读取时正在停止程序(Ctrl+C 向程序发送中断信号)。当你停止一个程序时,你无法控制它什么时候真正停止——它可以多执行几行,立即停止,或者干脆完成所有事情然后停止。当用户输入空行 (s.isEmpty()) 时,此更改只是打破了 while 循环以停止读取用户输入,您可以让用户写入“结束”或“停止”,然后执行 if(s.equals("stop")) 或类似的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2023-01-11
  • 2011-09-10
  • 1970-01-01
相关资源
最近更新 更多