Получение случайных чисел после простой математической задачи. Может быть вещь локальной переменной - PullRequest
0 голосов
/ 08 мая 2019

У меня есть графический интерфейс, работающий над интерфейсом. Но на заднем плане у меня есть маленькая проблема с моей математикой. Код пытается подсчитать, сколько времени прошло только с начальными и конечными часами. (По дням нет информации). Поэтому я думаю, что нашел способ подсчитать часы, проведенные на бумаге. Но в C # я потерпел неудачу, я думаю, из-за локальных переменных.

float start = float.Parse(textBox1.Text);
float end = float.Parse(textBox2.Text);
float hours_spent = end - start;
if (start > end) {
    hours_spent = 24.00f -start + end;
}

Первая часть работает правильно, но когда я начинаю больше конца, она дает мне случайные числа.

РЕДАКТИРОВАТЬ: Когда я дал 14,00 в качестве ввода и 13,00 в качестве вывода, я получаю -76 и для входа 14.00 выведите 12.00, я получу -176, а для 18.50 до 10.25 - -801. Это не случайно, я вижу это слишком плохо при выборе слов. Но я не понимаю, что не так

Ответы [ 2 ]

5 голосов
/ 08 мая 2019

Когда я дал 14.00 на входе и 13.00 на выходе, я получил -76

Вы выполняете синтаксический анализ в той части мира, где . не является десятичным разделителем, а является общим "групповым" разделителем. Таким образом, число, такое как сто тысяч плюс четверть, пишется 100.000,25, а не как в Соединенных Штатах, 100,000.25. Parse предполагает, что строка имеет формат локали текущего пользователя, если вы не укажете иное.

Поэтому вы разбираете строки в значения 1400 и 1300. Их разница составляет -100, что меньше 0, поэтому вы добавляете 24 к -100 и получаете -76.

То же самое для вашего другого случая. У вас есть 1850 и 1025, вычтите их, чтобы получить -825, добавьте 24, и вы получите -801.

Здесь нет ничего "случайного"; все работает как положено.

Здесь есть урок: работа в обратном направлении . Вы получили -76. Как это случилось? Вы, должно быть, добавили 24 к чему-то. Что добавлено к 24 дает вам -76? -100. Как мы получили -100? И так далее.

Начать сначала . Вы не должны разбирать поплавки в первую очередь. Если это десятичная величина, тогда вы должны анализировать десятичное значение , и если вы знаете, что у него всегда будет . в качестве десятичного разделителя, вы должны сказать об этом, когда будете анализировать его. (Подсказка: используйте версию TryParse, которая принимает NumberStyles и правильно установите стиль.)

Если, с другой стороны, вы знаете, что это два целых числа, разделенных точкой , то вам не следует анализировать ее как десятичное число или число с плавающей запятой. Вы должны проанализировать целое число, затем точку, а затем целое число.

Если это часы, то период, а затем минуты, и опять же, вам не следует использовать ничего из вышеперечисленного. Используйте анализатор даты и времени для разбора даты и времени.

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

Другие проблемы с вашим кодом:

  • Используйте TryParse, а не Parse, когда имеете дело с пользовательским вводом. Вы не знаете, что там есть действительное число, но Parse вылетит, если получит неверный ввод.
  • Ваша математика, вероятно, неверна. Если кто-то вставит 100 и 200, вы действительно хотите -76 в качестве результата?

Сделайте шаг назад и спросите себя, каков настоящий бизнес-процесс, который вы пытаетесь построить здесь. Тщательно запишите этот бизнес-процесс , а затем внедрите этот процесс, а не в его приближении. Ваш бизнес-процесс, вероятно, не говорит "анализировать число с плавающей точкой, используя правила текущей локали", но это код, который вы написали. Напишите код, который означает именно то, что вы хотите, чтобы он означал .

ОБНОВЛЕНИЕ: Комментарии к вопросу показывают, насколько глубоко вы попали в дыру:

Если время входа 13,55, а время выхода 14,05, каким должен быть ожидаемый логический результат? Это должно быть 10 (минут) или 50 (числовая разница)?

Я жду 10 минут

Тогда абсолютно не нужно разбирать как float или decimal! Синтаксический анализ с плавающей точкой или десятичной дробью, очевидно, совершенно неверен , потому что 1.1 и 1.10 являются одинаковыми значениями как число, но девять минут отличаются , если это «hours.minutes», и вы не можете определить, в каком случае вы находитесь, анализируя число.

Опять же, вам нужно прекратить писать код, стереть все, что вы уже написали, и начать с . Вы в яме: перестаньте копать глубже, заполните яму и вернитесь на уровень земли.

Вам необходимо выяснить точно в каком формате находятся ваши строки, и проанализировать точно этого формата и ничего больше .

Итак, напишите спецификацию, которая ставит, а затем отвечает на вопросы о том, что разрешено, а что нет.Допускаются ли отрицательные значения?Что делать, если количество минут больше 60?Что делать, если минуты или часы полностью отсутствуют?И т. Д.

Получив спецификацию, напишите тестовые примеры, которые проверяют спецификацию .Затем напишите реализацию и запустите свои тесты.Код, скорее всего, будет правильным, если вы сначала напишите тесты.

0 голосов
/ 16 мая 2019

Я собираюсь полностью игнорировать предоставление дидактического ответа в пользу попытки обойти проблему.

Избегайте написания собственного кода синтаксического анализа. Вместо этого замените все свои TextBoxes на DateTimePickers с Format, установленным на Time. Затем выведите время, вызвав свойство .Value.TimeOfDay. TimeOfDay - это TimeSpan, поэтому он поддерживает простую арифметику.

Предупреждение. Будьте внимательны при извлечении этих результатов, используя указанные свойства. Например, 150 минут можно перевести как 2 .Hours и 30 .Minutes или как 150 .TotalMinutes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...