javascript - 对零件号进行四舍五入/向上取整以匹配总计值

标签 javascript mysql math

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

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

示例数据:

值1:16658807.49

值2:94182053.40718205

值3:1005668.7204374762

值4: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 这还不错。

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

(值1/112269423.46428402144)*100 = 14.838240881587516953758075138633

(值2/112269423.46428402144)*100 = 83.889317768825935717434356973035

(值3/112269423.46428402144)*100 = 0.8957636811570578380232989593602

(value4/112269423.46428402144)*100 = 0.37667766842948949078426892897153

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

百万代表也是如此。

有什么帮助吗?

最佳答案

好的,我想我现在明白你的问题了。希望这个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);

关于javascript - 对零件号进行四舍五入/向上取整以匹配总计值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25296331/

相关文章:

javascript - Pushwoosh 和 PhoneGap 2.5.0 实现

javascript - 尝试获取 Jquery 中两个日期之间的周数

algorithm - 求1到N所有数字的位数之和

algorithm - 找到垂直于另一个向量的向量的好方法?

math - 如何计算 2^n 模 1000000007 , n = 10^9

javascript - 隐藏/显示特定内容并保存为 localStorage

Javascript Canvas 矩形动画不起作用

MySQL 模式匹配和替换

PHP MySQL Populated Select Options 使正确的 "Selected"

php - 什么是使PHP网站接近数据库面向对象的好方法?