开发者问题收集

循环遍历对象来执行最接近高整数的数学运算吗?

2020-03-07
58

我希望循环遍历一个对象,获取一组值,然后计算出该值与下一个整数之间的差值。

例如,假设我有这个对象:

const data = [
   {
      "uid": "1121212",
      "amount": {
         "money": 11.2
      },
      "sourceAmount": {
         "money": 2.2
      }
   },
   {
      "uid": "343343443",
      "amount": {
         "money": 222.30
      },
      "sourceAmount": {
         "money": 444
      }
   },
   {
      "uid": "44",
      "amount": {
         "money": 54.21
      },
      "sourceAmount": {
         "money": 32
      }
   }
]

如果可能,我希望循环遍历它并从 amount.money 键中获取值,然后计算出该数字与下一个整数之间的差值。因此在上面的例子中,可以获取值 11.22 & 222.30 & 54.21 并计算出与 12 22355 之间的差值,因为这些是下一个值。因此差值将如下所示: 78 & 7079 。这些值(我在想)可以推入数组吗?

我一直在研究 map() 功能,但很难形成满足我需求的功能?我有一些类似的东西:

const difference = [];

for (let i = 0, l = data.length; i < l; i++) {
    var money = data.amount.money[i];
    let roundedNumber = Math.ceil(money);
    let d = function (money, roundedNumber) { return Math.abs(roundedNumber - money); }
    difference.push(d)
}

我认为这是一次糟糕的尝试,任何有关最佳实践的帮助都会很棒。

差异数组应如下所示: const difference = ['78', '70', '79'];const difference = ['0.78', '0.70', '0.79'];

2个回答

我认为以下 .map() Math.ceil() 组合可以起作用:

const data = [ { "uid": "1121212", "amount": { "money": 11.2 }, "sourceAmount": { "money": 2.2 } }, { "uid": "343343443", "amount": { "money": 222.30 }, "sourceAmount": { "money": 444 } }, { "uid": "44", "amount": { "money": 54.21 }, "sourceAmount": { "money": 32 } } ]
const result = data.map(e => (Math.ceil(e.amount.money) - e.amount.money).toFixed(2));
console.log(result);

由于 12 - 11.2 ,第一个值为 0.80

请查找使用 Number.parseFloat() 解析的数字:

const data = [ { "uid": "1121212", "amount": { "money": 11.2 }, "sourceAmount": { "money": 2.2 } }, { "uid": "343343443", "amount": { "money": 222.30 }, "sourceAmount": { "money": 444 } }, { "uid": "44", "amount": { "money": 54.21 }, "sourceAmount": { "money": 32 } } ]
const result = data.map(e => Number.parseFloat((Math.ceil(e.amount.money) - e.amount.money).toFixed(2)));
console.log(result);

希望这对您有所帮助!

norbitrial
2020-03-07

如果您希望 result 中包含整数,则以下内容可能会有所帮助。在 float_val*100 上应用 round() 比执行 float_val.toFixed(2)*100 更好,因为第二种方法会因舍入误差而导致结果不准确。

const data = [ { "uid": "1121212", "amount": { "money": 11 }, "sourceAmount": { "money": 2.2 } }, { "uid": "343343443", "amount": { "money": 222.30 }, "sourceAmount": { "money": 444 } }, { "uid": "44", "amount": { "money": 54.216 }, "sourceAmount": { "money": 32 } } ]
const result = data.map(e =>Math.round(100*(1-e.amount.money%1))%100);
console.log(result);

编辑 : 根据您的评论,我在公式中又添加了一个 %100 。我还更改了一些示例值以演示舍入行为。第一个值现在返回 0,最后一个(更改后的)值 54.216 将导致余数 78.4,然后将其舍入为 78。

Carsten Massmann
2020-03-07