javascript - 计算给出错误结果的百分比

标签 javascript html

我有一个包含一些数据的 HTML 表格。我正在将该数据转换为百分比,以将它们填充到 UI 上的 HTML 表格中。

到目前为止我做了什么:

  • 使用基本公式计算百分比即 (no./total)100
  • 它为标题行(即一行)提供了正确的结果。
  • 对于第二行,我应用了相同的公式但得到了一些错误的结果

片段

const data = [
  {
    "amount": 518212,
    "billdate": "2018-08-04",
    "outlet": "JAYANAGAR"
  },
  {
    "amount": 104801,
    "billdate": "2018-08-04",
    "outlet": "MALLESHWARAM"
  },
  {
    "amount": 138151,
    "billdate": "2018-08-04",
    "outlet": "KOLAR"
  },
  {
    "amount": 628358,
    "billdate": "2018-08-05",
    "outlet": "JAYANAGAR"
  },
  {
    "amount": 115223,
    "billdate": "2018-08-05",
    "outlet": "MALLESHWARAM"
  },
  {
    "amount": 134107,
    "billdate": "2018-08-05",
    "outlet": "KOLAR"
  },
  {
    "amount": 177866,
    "billdate": "2018-08-06",
    "outlet": "JAYANAGAR"
  },
  {
    "amount": 66095,
    "billdate": "2018-08-06",
    "outlet": "KOLAR"
  }
]

const formatData = function(data) {
  const billdates = []
  const outlets = []
  data.forEach(element => {
    if (billdates.indexOf(element.billdate) == -1) {
      billdates.push(element.billdate)
    }
    if (outlets.indexOf(element.outlet) == -1) {
      outlets.push(element.outlet)
    }
  })
  return {
    data,
    billdates,
    outlets,
  }
}

const renderTable = function(data) {
  billdates = data.billdates
  outlets = data.outlets
  data = data.data
  const tbl = document.getElementById('tbl')
  const table = document.createElement('table')
  const thead = document.createElement('thead')
  let headerRow = document.createElement('tr')
  let th = document.createElement('th')
  th.innerHTML = 'Bill_____Date'
  headerRow.appendChild(th)
  let grandTotal = 0
  const outletWiseTotal = {}
  th = document.createElement('th')
  th.innerHTML = 'Total1'
  headerRow.appendChild(th)
  outlets.forEach(element => {
    th = document.createElement('th')
    th.innerHTML = element

    headerRow.appendChild(th)
    outletWiseTotal[element] = 0
    data.forEach(el => {
      if (el.outlet == element) {
        outletWiseTotal[element] += parseInt(el.amount)
      }
    })
    grandTotal += outletWiseTotal[element]
  })
  thead.appendChild(headerRow)
  headerRow = document.createElement('tr')
  th = document.createElement('th')
  th.innerHTML = 'Total'
  headerRow.appendChild(th)

  outlets.forEach(element => {
    th = document.createElement('th')
    //   console.log(outletWiseTotal[element]);
    const test = (outletWiseTotal[element] / grandTotal) * 100
    const fix = `${test.toFixed(2)}%`
    console.log(fix) // this one is giving me right result for row "Total"
    th.innerHTML = fix
    th.classList.add('text-right')
    // ol wise total

    headerRow.appendChild(th)
  })
  th = document.createElement('th')
  th.innerHTML = '100%' // grandTotal
  th.classList.add('text-right')
  // grand total
  headerRow.insertBefore(th, headerRow.children[1])
  thead.appendChild(headerRow)
  table.appendChild(thead)

  const tbody = document.createElement('tbody')
  billdates.forEach(element => {
    const row = document.createElement('tr')
    td = document.createElement('td')
    td.innerHTML = element
    row.appendChild(td)
    let total = 0
    outlets.forEach(outlet => {
      let el = 0
      data.forEach(d => {
        if (d.billdate == element && d.outlet == outlet) {
          total += parseInt(d.amount)
          el = d.amount
        }
      })
      td.classList.add('text-right')
      const test1 = (el / total) * 100
      console.log(test1) // this one is giving some wrong result for first column it is giving 100% which is wrong
      td = document.createElement('td')
      td.innerHTML = el.toLocaleString('en-in')
      row.appendChild(td)
    })

    td = document.createElement('td')
    td.innerHTML = '100%' // total date wise
    td.classList.add('text-right')
    console.log(total) // total date wise

    row.insertBefore(td, row.children[1])
    tbody.appendChild(row)
  })

  table.appendChild(tbody)
  tbl.innerHTML = ''
  tbl.appendChild(table)
  table.classList.add('table')
  table.classList.add('table-striped')
  table.classList.add('table-bordered')
}
const formatedData = formatData(data)
renderTable(formatedData)
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" type="text/css" />

<script src="https://code.jquery.com/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<div id="tbl"></div>

  • 请查看代码片段;为了更清楚,我把控制台放在那里,它给出了 100

  • 我的表是完全动态的。

我使用了正确的方法,但得到了一些错误的数据。

最佳答案

检查更新后的代码

var data = [{"amount":518212,"billdate":"2018-08-04","outlet":"JAYANAGAR"},{"amount":104801,"billdate":"2018-08-04","outlet":"MALLESHWARAM"},{"amount":138151,"billdate":"2018-08-04","outlet":"KOLAR"},{"amount":628358,"billdate":"2018-08-05","outlet":"JAYANAGAR"},{"amount":115223,"billdate":"2018-08-05","outlet":"MALLESHWARAM"},{"amount":134107,"billdate":"2018-08-05","outlet":"KOLAR"},{"amount":177866,"billdate":"2018-08-06","outlet":"JAYANAGAR"},{"amount":66095,"billdate":"2018-08-06","outlet":"KOLAR"}]
    /*var data = [
  {
    amount: 518212,
    billdate: '2018-08-04',
    outlet: 'JAYANAGAR',
  },
  {
    amount: 104801,
    billdate: '2018-08-04',
    outlet: 'MALLESHWARAM',
  },
  {
    amount: 138151,
    billdate: '2018-08-04',
    outlet: 'KOLAR',
  },
]
*/

    let formatData = function (data) {
        let billdates = [];
        let outlets = [];
        data.forEach(element => {
            if (billdates.indexOf(element.billdate) == -1) {
                billdates.push(element.billdate);
            }
            if (outlets.indexOf(element.outlet) == -1) {
                outlets.push(element.outlet);
            }
        });
        return {
            data: data,
            billdates: billdates,
            outlets: outlets,

        };
    };

    let renderTable = function (data) {
        billdates = data.billdates;
        outlets = data.outlets;
        data = data.data;
        let tbl = document.getElementById("tbl");
        let table = document.createElement("table");
        let thead = document.createElement("thead");
        let headerRow = document.createElement("tr");
        let th = document.createElement("th");
        th.innerHTML = "Bill_____Date";
        headerRow.appendChild(th);
        let grandTotal = 0;
        let outletWiseTotal = {};
        th = document.createElement("th");
        th.innerHTML = "Total1";
        headerRow.appendChild(th);
        outlets.forEach(element => {
            th = document.createElement("th");
            th.innerHTML = element;

            headerRow.appendChild(th);
            outletWiseTotal[element] = 0;
            data.forEach(el => {
                if (el.outlet == element) {
                    outletWiseTotal[element] += parseInt(el.amount);
                }
            });
            grandTotal += outletWiseTotal[element];
        });
        thead.appendChild(headerRow);
        headerRow = document.createElement("tr");
        th = document.createElement("th");
        th.innerHTML = "Total";
        headerRow.appendChild(th);

        outlets.forEach(element => {
            th = document.createElement("th");
            //   console.log(outletWiseTotal[element]);
            var test = ((outletWiseTotal[element] / grandTotal) * 100);

            var fix = test.toFixed(2) + "%";
            console.log(fix)    // this one is giving me right result for row "Total"
            th.innerHTML = fix;
            th.classList.add("text-right");
            //ol wise total  

            headerRow.appendChild(th);
        });
        th = document.createElement("th");
        th.innerHTML = "100%" //grandTotal
        th.classList.add("text-right");
        // grand total
        headerRow.insertBefore(th, headerRow.children[1]);
        thead.appendChild(headerRow);
        table.appendChild(thead);

        let tbody = document.createElement("tbody");
        billdates.forEach(element => {
            let row = document.createElement("tr");
            td = document.createElement("td");
            td.innerHTML = element;
            row.appendChild(td);
            let total = 0;
            
            outlets.forEach(outlet => {
                let el = 0;
                let tempTotal = 0;
                data.forEach(d => {
                    if (d.billdate == element && d.outlet == outlet) {
                        total += parseInt(d.amount);
                        el = d.amount;
                    }
                    if (d.billdate == element){
                    tempTotal += parseInt(d.amount);
                }
                });
                
                td.classList.add("text-right");
                var test1 = ((el / tempTotal) * 100);
                console.log('(' + el + '/' + tempTotal + ')*100 == ' + test1)     //this one is giving some wrong result for first column it is giving 100% which is wrong
                td = document.createElement("td");
                td.innerHTML = el.toLocaleString('en-in');
                row.appendChild(td);
            });

            td = document.createElement("td");
            td.innerHTML = total;  //total date wise
            td.classList.add("text-right");
            //console.log(total) // total date wise

            row.insertBefore(td, row.children[1]);
            tbody.appendChild(row);
        });

        table.appendChild(tbody);
        tbl.innerHTML = "";
        tbl.appendChild(table);
        table.classList.add("table");
        table.classList.add("table-striped");
        table.classList.add("table-bordered");
    }
    let formatedData = formatData(data);
    renderTable(formatedData);
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" type="text/css" />

<script src="https://code.jquery.com/jquery.min.js"></script>

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<div id="tbl"></div>

关于javascript - 计算给出错误结果的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53864522/

相关文章:

javascript - WebRTC:添加了 MediaStream 但没有媒体可见

javascript - 寻找好的 Mootools Javascript 教程

从循环中反转的 Javascript setTimeout 参数

javascript - 在 HTML 中具有自定义按钮样式的输入文件

javascript - 控制 CSS 状态 : hover, 事件

jquery - 使用 Form 定位 Iframe 会导致打开新窗口

javascript - 具有多张幻灯片的 BX slider 仅显示一张幻灯片

javascript - 如何获取对象的第一个真值并返回对应的键?

javascript - 如何从 iframe 中获取字段数据?

html - 导航栏拉伸(stretch)我页面的整个宽度