Я пытался сделать холлендж/проблему, как показано ниже в HackerRank. (Вам не нужно входить, чтобы просмотреть проблему, для тех, кто не хочет просматривать ее по ссылке, я кратко напишу про описание проблемы).Неисправность логической инструкции IF для удвоений C#
https://www.hackerrank.com/challenges/time-conversion
Учитывая указанный вход (строка) даты (2:34:50 PM) в AM формате/PM, я должен был превратить его в военное время (14:34:50). Полночь в Вооруженных силах - 00:00:00, а в формате AM/PM - 12:00:00 AM, а на второй день в Милатари - 12:00:00, а в формате AM/PM - 12:00:00 PM.
Теперь подход, который я использовал, это проверка второго последнего значения строки, поскольку был указан формат ввода. B/c Мне нужно изменить только часы, которые я использую только для 0-го и 1-го индексов строки, которые преобразуют его в double, используя «GetNumericValue».
Теперь, когда я использую значения этих удвоений в моей инструкции IF (в блоке PM if), они терпят неудачу, если я проверяю на «! =». Я привел код ниже. После использования отладчика и просмотра того, что происходит, он полностью отказывается от оператора IF, содержащего «! =». Это происходит, если мой ввод имеет «1» в первом индексе или имеет «2» во втором индексе.
Сначала я думал, что это может быть проблема с точностью двойного с таким небольшим числом, однако мой код дает правильный ответ, если вход «01: xx: xxPM». Поэтому я склонен думать о своей логике моего заявления IF, хотя я так долго смотрел на него, и я понятия не имею, почему это не сработает. Я дал альтернативный фрагмент кода, который я написал, который сработал. Я в основном сделал то же самое, за исключением того, я использовал «==» и заявление еще (до этого я использовал «! =» И оператор еще)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HackerRank_Algorithms
{
class Time_Conversion
{
static void Main(string[] args)
{
//Reading input Date in the format "02:34:50PM"
string time = Console.ReadLine();
//Creating a double array for storing the first digits that is the hours
//used double since 'GetNumericValue' returns type double
double[] timeIn24 = new double[2];
//loop to convert the first two digits from string into double
for (int x = 0; x < 2; x++)
{
timeIn24[x] = char.GetNumericValue(time, x);
}
//Because I know the date will always be in a specified format I check at the place for
//'P' or 'A' for AM or PM
//If PM then do this
if (time[time.Length-2] == 'P')
{
//Console.WriteLine("Time is PM");
/********************************************
//I tried doing this since but didn't work
//timeIn24[1] = Convert.ToInt32(timeIn24[1]);
//timeIn24[0] = Convert.ToInt32(timeIn24[0]);
*********************************************/
//Console.WriteLine("Before {0} timeIn24[0]", timeIn24[0]);
//Console.WriteLine("Before {0} timeIn24[1]", timeIn24[1]);
//PROBLEM OCCURRING HERE I check if its 12PM or not if it isn't then I do the follwoing
if (timeIn24[1] != 2 && timeIn24[0] != 1)
{
//add 2 to the unit of hours
timeIn24[1] = timeIn24[1] + 2;
//Console.WriteLine("After addition {0} timeIn24[0]", timeIn24[0]);
//if the sum i get is greater than 10 that is I'm getting a carry
if (timeIn24[1] > 9)
{
//I add one to the tenth of hours
timeIn24[0] = timeIn24[0] + 1;
//Modulus to get the last digit of unith hour
timeIn24[1] = timeIn24[1] % 10;
}
timeIn24[0] = timeIn24[0] + 1;
Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
//Console.WriteLine(timeIn24[0]);
//Console.WriteLine(timeIn24[1]);
}
else //if its 12PM then I do not do anything and I print it as is
{
Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
}
/***********CODE THAT GAVE THE CORRECT SOLUTION******************/
//if (timeIn24[1] == 2 && timeIn24[0] == 1)
//{
// Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
// //timeIn24[0] = timeIn24[0]/10;
// //Console.WriteLine(timeIn24[0]);
// //Console.WriteLine(timeIn24[1]);
//}
//else
//{
// timeIn24[1] = timeIn24[1] + 2;
// //Console.WriteLine("After addition {0} timeIn24[0]", timeIn24[0]);
// if (timeIn24[1] > 9)
// {
// timeIn24[0] = timeIn24[0] + 1;
// timeIn24[1] = timeIn24[1] % 10;
// }
// timeIn24[0] = timeIn24[0] + 1;
// Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
//}
/******************************************************************/
//Here I simply start from the first colon and print the date as string till end
int y = 2;
while(y < time.Length-2)
{
Console.Write("{0}", time[y]);
y++;
}
}
else //if its AM
{
//if its 12AM that is Midnight
if (timeIn24[0] == 1 && timeIn24[1] == 2)
{ //set both tenth and unit of hour to 0
timeIn24[0] = 0;
timeIn24[1] = 0;
}
//print the hours
Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
//again print from first colon + the remaining of string
int x = 2;
while (x < time.Length-2)
{
Console.Write("{0}", time[x]);
x++;
}
}
Console.ReadLine();
}
}
}
Вам нужно сравнить двойные значения, используя epsilon, а не только == или! = Или> = или <= и т. Д. См. Сравнение поплавков и парных разрядов с Epsilon. http://stackoverflow.com/questions/2411392/double-epsilon-for-equality-greater-than-less-than-less-than-or-equal-to-gre и http: // с плавающей запятой. de/errors/comparison/ – Brandon
Я думаю, что у вас будет больше успеха в работе с сборкой .NET в стиле DateTime. https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx – maniak1982
Существует много длинных академических материалов. Не разрешает ли хакерская программа встроенные функции? Должна быть проверка пользователей как «TryParse». И у вас уже есть 24-часовой формат 'date.ToString (" HH: mm: ss ")'. –