2015-08-24 3 views
1

Я сделал грубую версию обратного отсчета, которая имеет разрешение 10 секунд секунды. Я пытаюсь выразить результат как 0:59. Тем не менее, за время, когда счетчик составляет 450 десятых секунды (или 45 секунд), я заметил, что приведенная ниже математика возвращается как 1:45.Ошибка математики при создании таймера обратного отсчета

я перешел линию intMinutesRemaining = intQuestionTimer/600 иметь \, с исправлениями ошибок ... но теперь, когда часы пытается прочитать 1:00, он будет тикать до 0:60 затем 0:59. Это вычитание контролируется таймером, который имеет интервал в 100 миллисекунд.

(intQuestionTimer будет равна сказать 600 для второго таймера 60, а затем обратный отсчет от туда с Timer клеща, заставляя его быть вычтены 1.)

Private Sub UpdateQuestionTimer() 
    'lblQuestionTimer.Text = intQuestionTimer.ToString 
    Dim strFormat As String 

    Dim intMinutesRemaining As Integer 
    Dim intSecondsRemaining As Integer 

    intMinutesRemaining = intQuestionTimer/600 
    intSecondsRemaining = intQuestionTimer Mod 600 

    strFormat = "{0:0}:{1:00}" 

    lblQuestionTimer.Text = String.Format(strFormat, intMinutesRemaining, intSecondsRemaining/10) 

End Sub 

Какие изменения я должен сделать, чтобы это последовательно отображать правильный форматированный текст?

+0

Какой смысл в 10-й секунде, если вы показываете только секунды? – Amit

+0

@Amit: для обеспечения точной остановки/запуска. Подумайте об этом таким образом, если я остановлю таймер с оставшейся 9 секунд на точке, затем запустите его снова, таймер будет находиться в 8 секунд, не имея полной секунды. Другая причина: подумайте о том, почему НБА и другая спортивная организация теперь показывают 10 секунд секунды, когда на игровых часах осталось менее 1 минуты. –

+0

Если intQuestionTimer составляет десятые доли секунды, тогда 'intSecondsRemaining = intQuestionTimer Mod 600' - это число десятых долей секунды в текущую минуту. Вам нужно разделить на 10, чтобы получить секунды. – Blackwood

ответ

1

Вы не используете правильный оператор. Вы должны использовать \ оператор также при показе 10ths доли секунды

Private Sub UpdateQuestionTimer() 
    'lblQuestionTimer.Text = intQuestionTimer.ToString 
    Dim strFormat As String 

    Dim intMinutesRemaining As Integer 
    Dim intSecondsRemaining As Integer 

    intMinutesRemaining = intQuestionTimer \ 600 
    intSecondsRemaining = intQuestionTimer Mod 600 

    strFormat = "{0:0}:{1:00}" 

    lblQuestionTimer.Text = String.Format(strFormat, 
    intMinutesRemaining, intSecondsRemaining \ 10) 

End Sub 

Оператор/используется для операций с плавающей точкой, но если ваше значение intQuestionTimer является 599 разделив его на 10 производит 59,9. Это значение округляется до 60 раз. Вместо использования оператора \ для целочисленной операции предыдущее деление дает 59 без десятичной части, и оно отображается правильно.

+0

Это сейчас работает. Благодарю. –

1

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

Используйте оператор целочисленного деления \, или Math.Floor.