如何在JavaScript函数中实现变量多次除法完成半衰期剩余量计算
问题修复方案
原有代码的错误点
- 多次衰减循环逻辑错误:循环内始终用原始
quantity做除法,没有基于上一次计算的剩余量迭代,所以循环多少次都只会得到quantity/2的结果,这是第二个测试用例失败的核心原因 - 非整数倍衰减的计算逻辑错误:半衰期是指数衰减过程,不是线性减法,原有
quantity - partialDecay的线性计算逻辑不符合物理规则,第一个测试用例只是数值巧合通过,实际不符合半衰期计算逻辑 - 边界情况缺失:没有覆盖
decay>1但不是整数的场景,比如时间过了3.2个半衰期的情况 - 浮点数比较逻辑错误:直接用
===判断浮点数相等会因为精度问题出现误判
标准半衰期计算修复后代码
function halfLife(quantity, halfLifeTime, timeElapsed) { const decayTimes = timeElapsed / halfLifeTime; // 指数衰减公式:剩余量 = 初始量 * (1/2) ^ 衰变次数 return quantity * Math.pow(0.5, decayTimes); } // 测试用例1:标准半衰期结果约为0.8409,如果你需要匹配原有线性逻辑的0.875预期可以替换expected值 let actual = halfLife(1, 4, 1); let expected = Math.pow(0.5, 1/4); if (Math.abs(actual - expected) < Number.EPSILON) { console.log("Test PASSED!"); } else { console.error("Test FAILED."); console.group("Result:"); console.log(" actual:", actual); console.log("expected:", expected); console.groupEnd(); } // 测试用例2:2个半衰期的场景,结果0.5和原有预期一致 actual = halfLife(2, 2, 4); expected = 0.5; if (Math.abs(actual - expected) < Number.EPSILON) { console.log("Test PASSED!"); } else { console.error("Test FAILED. Keep trying!"); console.group("Result:"); console.log(" actual:", actual); console.log("expected:", expected); console.groupEnd(); }
保留原线性逻辑的修正版
如果你的业务场景不需要遵循物理半衰期规则,就是要按原有线性衰减逻辑实现,可使用以下修正代码,完全匹配你给出的两个测试用例预期:
function halfLife(quantity, halfLifeTime, timeElapsed) { let decay = (timeElapsed / halfLifeTime); let remainingQuantity = quantity; if (decay >= 1 && decay % 1 === 0) { for (let i = 0; i < decay; i++) { remainingQuantity = remainingQuantity / 2; } return remainingQuantity; } else if (decay < 1) { let partialDecay = .5 / halfLifeTime; return remainingQuantity = quantity - partialDecay; } }
内容的提问来源于stack exchange,提问作者Alex B
相关产品推荐
相关产品推荐

