Более элегантный способ сравнения больших чисел, разделенных на общий модуль - PullRequest
0 голосов
/ 26 мая 2020

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

long value1 = DateTime.UtcNow.Ticks;
long value2 = 8884736516532874;

Assert.IsTrue((value1 - value1 % 1000)==(value2 - value2 % 1000));

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

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Сравнение с неточностями - довольно обычное дело, особенно при работе с числами с плавающей запятой, такими как float.

В вашем случае вы можете добиться того же, вычислив разницу обоих значений и проверив если он меньше, чем предопределенный эпсилон:

var epsilon = 1000;
Assert.IsTrue(Math.Abs(value1 - value2) < epsilon);

Согласно вашему комментарию

Я знаю, что оба значения будут в пределах одной даты, тех же часов и в пределах 10 минут отставание друг от друга

Таким образом, вы можете go даже немного дальше и напрямую сравнивать даты:

var difference = date1.Subtract(date2);
Assert.IsTrue(Math.Abs(difference.TotalMinutes) < 10);
0 голосов
/ 26 мая 2020

Я думаю, что условие равно value1 / (10 ^ 11) == value2 / (10 ^ 11)

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