为什么我要用Math.ceil()-1,而不直接用Math.floor()

92 阅读1分钟

省流版

当输入值为整数时,Math.ceil()-1 和Math.floor() 明显会产生不同的结果。假设输入值为3.0,使用Math.ceil(3.0)-1 将得到2,而使用Math.floor(3.0) 将得到3。

正文

当我用Math.ceil()-1的时候是基于逻辑需求,完全没有联想到Math.floor(),所以也没有注释。我的组长codeReview的时候好奇为什么我用Math.floor(),我的第一反应就是:确实啊~为什么呢?但因为我写代码通常是有原因的,我相信当时的我肯定不会是因为不知道可以用Math.floor(),而是有什么不为人知的考量,才用的Math.ceil()-1。

背景是我有一个typeArray数组 [Float32Array(VerticesBufferSize),...,Float32Array(VerticesBufferSize)],需要计算出vertexIndex所在的typeArray的序号。vertexIndex + 1表示从1开始数的第几个顶点,*3之后除size知道是从1开始数的第几个buffer,再-1就是从0开始数的index,从逻辑上考虑自然而然的就写出了以下代码行。

let index = Math.ceil((vertexIndex + 1) * 3 / VerticesBufferSize) - 1;