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

JavaScript函数数值变量相乘返回异常及股票投资总额计算返回NaN问题求助

解决JavaScript函数的两个问题:数值相乘与股票投资总额计算

嘿,我来帮你搞定这两个JavaScript函数的问题!先从你给出代码的股票投资函数说起,再处理数值相乘的问题。

问题1:股票投资总额函数返回NaN的解决方法

你的代码里有个明显的问题:investments是一个数组,但你直接访问了investments.price和investments.numOfShares——数组本身并没有这些属性,所以这两个值都是undefined,undefined * undefined自然会返回NaN。

你需要先从数组里找到与传入股票名称匹配的对象,再计算它的总价。这里可以用数组的find()方法来定位目标对象,同时最好加上找不到对应股票时的容错处理。

修正后的代码如下:

let investments = [ 
  {stock: "AMZN", price: 400, numOfShares: 10}, 
  {stock: "AAPL", price: 300, numOfShares: 5}, 
  {stock: "BIDU", price: 250, numOfShares: 4} 
];

const calculateInvestedAmt = (stock) => {
  // 找到匹配的股票对象
  const targetStock = investments.find(item => item.stock === stock);
  
  // 容错:如果找不到对应股票,返回0或者抛出错误(按需选择)
  if (!targetStock) {
    console.log(`未找到股票${stock}的持仓信息`);
    return 0;
  }
  
  // 计算总投资金额:单价 × 持股数量
  const totalAmt = targetStock.price * targetStock.numOfShares;
  return totalAmt;
};

// 测试调用,现在会返回4000啦!
console.log(calculateInvestedAmt("AMZN"));

这样调用calculateInvestedAmt("AMZN")时,会先找到AMZN对应的对象,计算400 * 10,正确返回4000。

问题2:数值相乘无法返回整数的处理方案

这个问题通常是JavaScript浮点数精度限制导致的。因为JS里的Number是双精度浮点数,有些十进制小数(比如0.1、0.2)无法被精确表示,相乘后会出现类似0.1 * 0.2 = 0.020000000000000004的情况,看起来不是整数,但实际是精度误差。

根据你的需求,有几种常见的处理方式:

方式1:四舍五入到整数

如果只需要得到最接近的整数,直接用Math.round():

function multiplyToInteger(a, b) {
  const product = a * b;
  return Math.round(product);
}

console.log(multiplyToInteger(0.5, 3)); // 输出2
console.log(multiplyToInteger(2.0000000001, 5)); // 输出10

方式2:强制取整(向下/向上)

如果需要向下取整用Math.floor(),向上取整用Math.ceil():

// 向下取整
function multiplyFloor(a, b) {
  return Math.floor(a * b);
}
console.log(multiplyFloor(0.5, 3)); // 输出1

// 向上取整
function multiplyCeil(a, b) {
  return Math.ceil(a * b);
}
console.log(multiplyCeil(0.4, 3)); // 输出2

方式3:精确处理浮点数精度

如果需要避免浮点数误差导致的精度问题,可以先把小数转成整数计算,再转回原精度:

function multiplyPrecisely(a, b) {
  // 计算两个数的小数位数
  const getDecimalPlaces = (num) => {
    const str = num.toString();
    return str.includes('.') ? str.split('.')[1].length : 0;
  };
  
  const decimalsA = getDecimalPlaces(a);
  const decimalsB = getDecimalPlaces(b);
  const totalDecimals = decimalsA + decimalsB;
  
  // 转成整数相乘,再转回原精度
  const integerProduct = Math.round(a * Math.pow(10, decimalsA)) * Math.round(b * Math.pow(10, decimalsB));
  const product = integerProduct / Math.pow(10, totalDecimals);
  
  // 如果结果是整数,返回整数类型,否则返回原结果
  return Number.isInteger(product) ? parseInt(product) : product;
}

console.log(multiplyPrecisely(0.1, 0.2)); // 输出0.02(精确值)
console.log(multiplyPrecisely(400, 10)); // 输出4000(整数)

这样就能根据你的具体需求,处理数值相乘后的整数返回问题啦。

内容的提问来源于stack exchange,提问作者andrew c

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:14:09