You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写数值四舍五入代码时我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:45:10