编写数值四舍五入代码时我的decimal变量为何是'never'类型
问题解决方案
报错根因
你遇到的newCost类型为never的报错,以及原有逻辑不生效的问题,核心来自两个错误:
- JS中
typeof运算符对所有数值类型的返回值都是number,不存在float、int的返回结果,因此typeof newCost === "float"判断条件永远为假,TypeScript会判定对应if分支为永远不会执行的死代码,分支内的newCost就会被推导为never类型。 - 你判断小数位数的逻辑本身存在运算优先级错误:
typeof newCost * 10会先执行typeof newCost得到字符串"number",再拿字符串和10做乘法运算结果为NaN,永远不可能等于"int",整个if分支完全不会触发。
修复方案
JS内置的Number.prototype.toFixed(2)方法可以同时满足你的两个需求:自动将数值四舍五入到百分位,不足两位小数时自动补0,不需要自己写判断逻辑。
修正后代码如下:
// 增加非法值兼容,避免出现NaN const originCost = parseFloat(cost.textContent ?? '0'); const statePrice = parseFloat(this.state.price ?? '0'); const newCost = Math.round((originCost + statePrice) * 1.1 * 100) / 100; // 直接格式化输出两位小数,自动补0 cost.textContent = newCost.toFixed(2);
可选精度优化
如果业务对数值精度要求极高,需要规避toFixed方法在部分边界值下的银行家舍入问题,可以使用下面的兼容写法:
function formatToPercentile(num) { return (Math.round(num * 100) / 100).toFixed(2); } // 调用方法 cost.textContent = formatToPercentile(newCost);
内容的提问来源于stack exchange,提问作者Dark Shadow
相关产品推荐
相关产品推荐

