2016-08-26 3 views
0

Я хочу проверить, правильно ли введен код моего кода, поэтому я поставил много утверждений, проверяющих требования, и я не могу понять, почему он не работает. Предполагается, что n меньше или равно 91 и/или десятичной (я не хочу, чтобы мой вход тоже был). Это связано с тем, что пользователь не нарушает программу, набрав десятичную или несколько выше, чем 91.проверка на наличие нежелательного ввода (обработка ошибок)

while (Error == 1) { 
    n = user_input.nextDouble(); 
    if ((n - Math.round(n) <= 0.9) && (n - Math.round(n) >= 0.1)) { 
     System.out.println("Error: No Decimal points please, try again"); 
     continue; 
    } 
    if ((n - Math.round(n) <= 0.9) && (n - Math.round(n) >= 0.1) && (n > 91)) { 
     System.out.println("Error: No Decimal points please, try again"); 
     System.out.println("Error: Number too high, try again"); 
     continue; 
    } 
    if (n > 91) { 
     System.out.println("Error: Number too high, try again"); 
     continue; 
    } 
    if (n == Math.round(n)) { 
     Error = 0; 
    } 
    if (n == 0) { 
     break; 
    } 
} 

По какой-то причине, когда я типа 9.1 или 9.9 он не делает ничего вообще. Это пусто ... Я сделал> =, который должен проверить, если он больше или равен, и < =, который должен проверить, меньше или равно. Это неправильно?

+0

Если вы не хотите ничего, кроме целых чисел, то зачем спрашивать о двойном? –

+0

Так что, если кто-то вводит нежелательный вход, он не разбивает программу – TheLittleCoder

+0

Так что, если я введу что-то, что не цифра? Если вы хотите предотвратить сбой программы, вам нужно поймать исключение синтаксического анализа. –

ответ

0

Ну, во-первых, вам нужны только входы, которые являются целыми числами, не равными или равными 91. Кажется странным, что вы это скажете, но затем явным образом возьмите двойники с помощью следующего метода Double() сканера.

Есть более эффективные способы проверки целых ... см этот вопрос What's the best way to check to see if a String represents an integer in Java?

В любом случае, я предполагаю, что вы собираетесь на торчащие с инновационным методологии:

Вы правильны, что в обычная математика, 9.1 раундов до 9, а разница между ними меньше или равна 0,1. Ваши случаи должен работа.

Но добро пожаловать в мир алгебры с плавающей запятой Java! Удваивается не так хорошо здесь. Что я имел в виду, что они плохо сравниваются? Ну, разница между вашими «9.1» и «9» на самом деле равна 0.09999999999999964, а не 1. Java не компенсирует это при использовании базовых компараторов, поэтому сравнение не выполняется.

Надежда не потеряна! Существует лучший способ сравнения удвоений, чем с использованием обычных операторов сравнения. Представляем .... Double.compare() !! Вы можете прочитать Javadocs по этому методу, или вы можете пойти здесь для получения информации о том, что делает этот метод: some reliable tutorial site

Однако , что если они входной 9.0001? Ваш тест не удался, даже если сравнение работает так, как вы ожидали. Вы действительно должны пересмотреть свою математику здесь. Как и в, попробуйте это вместо этого:

Double.compare((n - Math.round(n)),0.0) != 0) 
+1

Спасибо !!! Я не знал, что java делает это вместо обычного способа или что существует метод сравнения для парных чисел! Вы ДЕЙСТВИТЕЛЬНО помогли! – TheLittleCoder

+1

Когда я набираю число с 19 цифрами, он делает это: Ошибка: нет десятичных точек, пожалуйста, повторите попытку. Почему это делает это вместо этого ?: Ошибка: слишком высокий номер, повторите попытку – TheLittleCoder

+0

на ~ 19 цифр, вы достигаете пределов двойной точности в Java с помощью метода Math.round. Если вы отлаживаете код, вы увидите, что 12345123451234512345 раундов (в алгебре Java) до 3.1217514143797371E18, который слишком далеко, чтобы сравниться, даже с Double.compare. Вам придется либо использовать BigDecimal, либо использовать другой метод проверки, чтобы увидеть, является ли ваш ввод целым или нет. Для этого стоит 1234567899876543211 (19 цифр). – Jeutnarg

0

В случае 9.1 и 9.9, ни одно из условий не выполнено. Вот почему ничего не делается. Петля повторяется и ждет следующего двойного ввода.

Здесь главный виновник: n - Math.round(n). Расчеты неточны. Например, в случае 9.1:

n - Math.round(n) значение равно 0.09999999999999964. Таким образом, условие n - Math.round(n) >= 0.1 никогда не выполняется и нет, если блок достигнут.

Смежные вопросы