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

Bil*_*ote 0 java math android 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,我宁愿学习我可能在我的箭袋中丢失的模式:)

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

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

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

msgBody.length() / 160是一个除法表达式,两边都是整数 - 所以它将执行整数除法.我怀疑你做错了什么,但说实话并不完全清楚.(您声称它没有正确评估,但您没有给我们一个示例输入/输出/预期输出供我们查看.)

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

numMsgs.setText((msgBody.length() + 159) / 160);
Run Code Online (Sandbox Code Playgroud)

这仍然执行整数除法,但+159意味着它会总结,如果输入的是不完全相同的160的倍数.

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