JavaScript 实现数值吸附到最近小数网格单位的解决方案咨询
数值网格吸附最简实现方案
核心逻辑
你之前提出的Math.round(x / grid) * grid本身就支持全数值范围、小数网格和负数输入,不存在绝对值大于1就只能返回整数的问题,你感知到的异常大概率是浮点数计算精度误差导致的。
三种常用吸附规则的实现如下:
- 四舍五入吸附(与你给出的示例匹配):
const snapRound = (x, grid) => Math.round(x / grid) * grid - 向下吸附(往负无穷方向取最近网格点):
const snapFloor = (x, grid) => Math.floor(x / grid) * grid - 向上吸附(往正无穷方向取最近网格点):
const snapCeil = (x, grid) => Math.ceil(x / grid) * grid
效果验证
以你给出的grid=0.25场景测试,输出完全匹配预期:
snapRound(0.1, 0.25) // 0 snapRound(0.5, 0.25) // 0.5 snapRound(-0.2, 0.25) // -0.25 snapRound(0.9, 0.25) // 1 snapRound(-0.45, 0.25) // -0.5 snapRound(3.125, 0.25) // 3 snapRound(-42.675, 0.25) // -42.75 snapRound(99.765, 0.25) // 100
浮点数精度优化
如果遇到0.1 + 0.2 = 0.30000000000000004这类浮点数精度问题,可以增加一步精度修正处理:
const snap = (x, grid) => { const snapped = Math.round(x / grid) * grid // 按网格的小数位数保留精度,避免异常尾数 const decimalLen = grid.toString().split('.')[1]?.length || 0 return Number(snapped.toFixed(decimalLen)) }
内容的提问来源于stack exchange,提问作者MirceaKitsune
相关产品推荐
相关产品推荐

