Math.round(msgBody.length()/ 160 + 0.5)没有正确评估?

时间:2011-03-22 12:40:14

标签: java android math rounding

所以我正在尝试动态计算将在给定消息长度内发送的SMS消息数。 SMS消息被分成160个字节(字符)块。我使用MOD 160< = 1,因为我需要考虑添加和减去文本。出于性能原因,我只想在边界附近进行numMsgs计算:0,1,160,161,320,321,......

问题是在msgBody长度为160时,舍入操作的计算结果为2(160/160 = 1 + 0.5向上舍入)。在160 + 1的倍数处,它应该计算到下一个最高整数,因为任何160字节+ 1个字节等于整个附加消息。

我通过使用OR运算符和== 1 OR == 159来完成这项工作。它正确递增和递减,但它只减少160 -1的倍数,这是不正确的。

此外,我可以将IF逻辑放在外部逻辑中,如果MOD评估为0(零),则简单地减1,但这似乎是kludgey,我宁愿学习我可能在我的箭袋中遗漏的模式:)< / p>

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

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

}

3 个答案:

答案 0 :(得分:6)

msgBody.length() / 160是一个除法表达式,双方都是整数 - 所以它将执行整数除法。我怀疑这就是你做错了什么,但说实话并不完全清楚。 (你声称它没有正确评估,但是你还没有给出我们要看的样本输入/输出/预期输出。)

老实说,最简单的方法是这样整理:

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

那仍在执行整数除法,但+159表示如果输入 是160的倍数,它将向上舍入。

我建议您可以执行该计算无论的边界 - 但如果与现有值相比没有变化,请确保您实际上没有更新UI。它会非常便宜 - 一个整数加一个整数除法。

答案 1 :(得分:0)

如果有消息,则至少会发送一条短信。 你想要

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

答案 2 :(得分:0)

只需使用正确的公式,使用int添加和分割即可。 Modulo可能比分裂更慢。但是,我不清楚你期望的结果是什么...... (msgBody.length() + 159) / 160还不够?