Round / Ceil部件号以匹配总值

时间:2014-08-13 21:18:51

标签: javascript mysql math

所以这是一个有点奇怪的问题,我缺乏搜索的词汇(英语不是我的母语)。

我有来自MySQL数据库的double个值。 我在表格中显示这些值,但需要显示数百万和百分比的值。

示例数据:

value1: 16658807.49

value2: 94182053.40718205

value3: 1005668.7204374762

value4: 422893.84666449524

这些值总计为112269423.46428402144。 我的toMillions功能:

function toMillions(num, decimalPlaces) {
    var str;
    decimalPlaces = decimalPlaces || 0;
    num = +num;
    var factor = Math.pow(10, decimalPlaces);
    str = Math.floor(num / (1000000 / factor)) / factor;
    return str;
}

toMillions(112269423.46428402144,0) = 112 这还不错。

当我尝试计算每个的百分比时,实际问题就出现了:

(value1 / 112269423.46428402144)*100 = 14.838240881587516953758075138633

(value2 / 112269423.46428402144)*100 = 83.889317768825935717434356973035

(value3 / 112269423.46428402144)*100 = 0.8957636811570578380232989593602

(value4 / 112269423.46428402144)*100 = 0.37667766842948949078426892897153

但是,我需要将百分比显示为整数(删除小数点)。 如果我使用Math.ceilMath.round执行此操作,则总百分比值不会达到100%

百万代表也是如此。

任何帮助?

1 个答案:

答案 0 :(得分:1)

好的,我想我现在明白你的问题。希望这个fiddle能够回答它。我冒昧地将每个百分比四舍五入到小数点后10位。现在,当它们被添加时,它们等于100.舍入过程本身是必不可少的,因为这些百分比中的一些(或全部?)是重复小数,并且JavaScript会自动切断它们。它们永远不会100%准确。问题是,距离足够接近?

JS:

function round_number(num, dec) {
    return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

var v1 = 16658807.49;
var v2 = 94182053.40718205;
var v3 = 1005668.7204374762;
var v4 = 422893.84666449524;
var vals = [v1,v2,v3,v4];
var tot = v1 + v2 + v3 + v4;
document.getElementById('body').innerHTML += (tot+'<br/>');
for (var v in vals) {
    vals[v] = (vals[v] / tot) * 100;
    vals[v] += ' ';
    vals[v] = round_number(vals[v], 10);//parseFloat(vals[v].substr(0, (vals[v].indexOf('.') + 16)), 10);
    document.getElementById('body').innerHTML += (vals[v]+'<br/>');
}
tot = vals[0] + vals[1] + vals[2] + vals[3];
//tot += ' ';
//tot = tot.substr(0, (tot.indexOf('.') + 11));
document.getElementById('body').innerHTML += (tot+'<br/>');

这会在没有舍入的情况下切断任何小数。

JS:

var value1 = 16658807.49;
var newVal = (value1 / 112269423.46428402144)*100;
newVal = newVal + ' ';
newVal = newVal.substr(0, newVal.indexOf('.'));

这只会丢弃小数点。

JS:

var value1 = 16658807.49;
var newVal = (value1 / 112269423.46428402144)*100;
newVal = newVal + ' ';
var newVal_1 = newVal.substr(0, newVal.indexOf('.'));
var newVal_2 = newVal.substr((newVal.indexOf('.')+1));
newVal = newVal_1 + newVal_2;

要将您的弦号newVal恢复为整数格式,请使用:

newVal = parseInt(newVal ,10);