Ищу совет о том, как остановить таймер, используемый в LinearProgressIndicator

Я использую LinearProgressIndicator для визуального отображения обратного отсчета времени и запуска функции через определенные промежутки времени. Я делаю это, обновляя свойство value LinearProgressIndicator, используя переменную состояния _progress, которая уменьшается на 0,01 каждые 100 миллисекунд. Когда я устанавливал условия, основанные на двух десятичных знаках или даже на 0 if (_progress == 0.75), я обнаружил, что условия пропускаются, потому что значение _progress быстро становится гораздо большей дробью, которая не соответствует моему условию (например, 0,7502987777777). Я предполагаю, что это неотъемлемая проблема работы с двойниками, но тогда возникает вопрос: как лучше всего справиться с этим, если вы хотите запускать действия на основе значения _progress? Мой подход заключается в расширении условий - например if (_progress > 0.75 && _progress < 0.76).

Любые советы/советы будут оценены. Спасибо.

Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

bool closeTo(double value1, double value2, [double epsilon = 0.001]) =>
  (value1 - value2).abs() <= epsilon;

if (closeTo(_progress, 0.75)) {
  // Do something.
}

(package:matcher имеет аналогичную функцию closeTo для сопоставления значений в тестах.)

Возможно, поскольку значения с плавающей запятой являются плавающими, ваш допуск должен зависеть от величины значений.

В вашем случае вам также следует серьезно подумать о том, чтобы избегать значений с плавающей запятой для внутреннего состояния: используйте значения с фиксированной запятой, умножая все на 100 и используя вместо этого ints. То есть пусть _progress будет int, уменьшайте его на 1 каждые 100 мс, и тогда вы можете напрямую и точно сравнивать с 75 или другими значениями. Это также будет иметь то преимущество, что не будет накапливаться ошибка с плавающей запятой, когда вы многократно уменьшаете _progress. Если вам нужно представить _progress пользователю или передать его LinearProgressIndicator, используйте вместо этого _progress / 100.

Доооо!! Это имеет гораздо больше смысла. Я просто изменил _progress на int, начиная со 100 и уменьшая его на 1 каждые 100 миллисекунд, а затем использовал _progress/100 в LinearProgressIndicator. Это позволило мне использовать целые числа в операторе if if (_progress == 75), и это сработало как шарм. Спасибо, что нашли время, чтобы помочь мне думать иначе. Очень признателен.

user3735816 19.12.2020 19:05

Другие вопросы по теме