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
相关产品推荐
相关产品推荐

