Math.round (msgBody.length () / 160 + 0,5) Не оценивается правильно? - PullRequest
0 голосов
/ 22 марта 2011

Поэтому я пытаюсь динамически рассчитать количество SMS-сообщений, которые будут отправлены для данной длины сообщения.SMS-сообщения разбиваются на 160-байтовые (символьные) куски.Я использую MOD 160 <= 1, потому что мне нужно учитывать для добавления и вычитания текста.Из соображений производительности я хочу выполнять вычисления numMsgs только вблизи границ: 0, 1, 160, 161, 320, 321, ... </p>

Проблема в том, что при длине msgBody в 160 операция округления оценивается как2 (160/160 = 1 + 0,5 с округлением в большую сторону).При значениях, кратных 160 + 1, должно получиться следующее наибольшее целое число, потому что любые 160 байтов + 1 байт равны целому дополнительному сообщению.

Я сделал эту работу, используя оператор ИЛИ и == 1 ИЛИ ==159. Он правильно увеличивается и уменьшается, но уменьшается только с кратностью 160 с -1, что неверно.

Кроме того, я могу поместить логику IF во внешнюю логику, чтобы просто вычесть 1, если MOD оценивает в 0(ноль), но это выглядело бестолково, и я бы лучше выучил шаблон, который мне может не хватать в моем колчане:)

if (msgBody.length() % 160 <= 1) {

    numMsgs.setText(Math.round(msgBody.length() / 160 + 0.5));

}

Ответы [ 3 ]

6 голосов
/ 22 марта 2011

msgBody.length() / 160 является выражением деления с обеими сторонами, являющимися целыми числами - поэтому оно будет выполнять целое число деление. Я подозреваю это то, что вы делаете неправильно, но если честно, не совсем понятно. (Вы утверждаете, что это неправильно оценивается, но вы не дали пример ввода / вывода / ожидаемого результата, чтобы мы могли на него посмотреть.)

Если честно, самый простой подход - округлить так:

numMsgs.setText((msgBody.length() + 159) / 160);

Это все еще выполняет целочисленное деление, но +159 означает, что оно округлится, если ввод не будет точно , кратным 160.

Я предлагаю вам выполнить этот расчет независимо от границ - но убедитесь, что вы на самом деле не обновляете интерфейс, если нет изменений по сравнению с существующим значением. Это будет очень дешево - одно целое добавление и одно целое деление.

0 голосов
/ 22 марта 2011

Достаточно просто сложить и разделить, используя int с правильной формулой.Модуло, вероятно, даже медленнее, чем деление.Однако мне не ясно, какого результата вы ожидаете ... (msgBody.length() + 159) / 160 недостаточно?

0 голосов
/ 22 марта 2011

Если есть сообщение, то будет отправлено как минимум 1 SMS. Вы хотите

      (length / 160) + (length%160 > 0 ? 1 : 0)
...