javascript中的四舍五入数字
在javasript中进行商业推广的最佳方式是什么 例如:javascript中的四舍五入数字,javascript,rounding,Javascript,Rounding,在javasript中进行商业推广的最佳方式是什么 例如: 0.145 -> ToString(2) -> 0.14 mathjs: math.round(0.145, 2)) -> 0.14 此外,带回合的数学pow不能100%工作 目前我使用: function number_format(number, decimals, dec_point, thousands_sep) { number = number + 0.000000001; number
0.145 -> ToString(2) -> 0.14
mathjs:
math.round(0.145, 2)) -> 0.14
此外,带回合的数学pow不能100%工作
目前我使用:
function number_format(number, decimals, dec_point, thousands_sep) {
number = number + 0.000000001;
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
s = '',
toFixedFix = function(n, prec) {
var k = Math.pow(10, prec);
return '' + Math.round(n * k) / k;
};
// Fix for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
if (s[0].length > 3)
{
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
}
函数编号格式(数字、小数、小数点、千位){
编号=编号+0.000000001;
数字=(数字+'')。替换(/[^0-9+\-Ee.]/g'');
变量n=!isFinite(+数字)?0:+数字,
prec=!isFinite(+小数)?0:Math.abs(小数),
sep=(typeof millen\u sep=='undefined')?,':millen\u sep,
dec=(dec_点的类型==‘未定义’?’:dec_点,
s=“”,
toFixedFix=函数(n,prec){
var k=数学功率(10,prec);
返回“”+数学四舍五入(n*k)/k;
};
//修正IE parseFloat(0.55)。toFixed(0)=0;
s=(prec?toFixedFix(n,prec):“”+数学四舍五入(n)).split(‘.);
如果(s[0]。长度>3)
{
s[0]=s[0]。替换(/\B(?=(?:\d{3})+(?!\d))/g,sep);
}
如果((s[1]| |“)。长度
使用此修复(数字=数字+0.00000000 1;)
我得到0.15分
有更好的方法吗?Math.round()
可以用整数来完成这项工作。你可以做一个很好的方法,将你的数字乘以10的幂,然后四舍五入,再除以相同的数字
@示例:十进制四舍五入以及它们之间的基准
因此,我的方法比其他方法更快:),但对于真正大的数字来说并不十分安全如果纯粹是为了格式化货币值,您可以使用类似的专用库
您提到的四舍五入也称为“银行家四舍五入”,如果一个数字要四舍五入到n位,那么如果n+1位是5,则第n位将四舍五入到最近的偶数 e、 g.四舍五入到2位:
2.345 => 2.34
2.335 => 2.34
以下可能适合,它没有经过彻底测试,并且对可以四舍五入的数字大小有限制,但它展示了一种方法。它基于toFixed,因此返回一个字符串
function bankersRound(n, d) {
var a, b;
var p = String(n).split('.');
if (p[1]) {
a = p[1].substr(0, d);
b = p[1].substr(d, 1);
// If the d+1 character is 5 and the d character is even, force
// toFixed to round down
if (b == 5 && !(a%2)) {
n = p[0] + '.' + a + '4';
}
}
return Number(n).toFixed(d);
}
console.log(bankersRound(23.365, 2)); // 23.36
console.log(bankersRound(23.366, 2)); // 23.37
console.log(bankersRound(23.355, 2)); // 23.36
console.log(bankersRound(23.345, 2)); // 23.34
console.log(bankersRound(23.335, 2)); // 23.34
出于好奇,这里有一种处理整数除法的技术,偶数取整是和讨论的技术: 您可能会担心溢出。事实上,如果n和d都较大,则n+d/2有可能超过允许范围
我认为最好的方法是将数字转换为字符串,然后查看所需舍入位置的数字,再看一个,然后手动应用舍入。我很快就会发布一个函数。“有更好的方法吗?”是的!不要使用浮动进行货币计算。将价格保持在最低单位,例如美分。然后,当你想用不同的单位(如欧元)显示数字时,你只需将数值除以100。有人能告诉我这个问题中的商业一词吗?商业四舍五入如下:如果第一个小数位的数字是0,1,2,3或4,那么它就被四舍五入。如果小数点后第一位的数字是5、6、7、8或9,那么它是向上舍入的。这只是基本的舍入,这里没有商业意义。尽量不要对你使用的术语太花哨。
function bankersRound(n, d) {
var a, b;
var p = String(n).split('.');
if (p[1]) {
a = p[1].substr(0, d);
b = p[1].substr(d, 1);
// If the d+1 character is 5 and the d character is even, force
// toFixed to round down
if (b == 5 && !(a%2)) {
n = p[0] + '.' + a + '4';
}
}
return Number(n).toFixed(d);
}
console.log(bankersRound(23.365, 2)); // 23.36
console.log(bankersRound(23.366, 2)); // 23.37
console.log(bankersRound(23.355, 2)); // 23.36
console.log(bankersRound(23.345, 2)); // 23.34
console.log(bankersRound(23.335, 2)); // 23.34
function roundToEven(n, d) {
var off = (n + d / 2)
var roundup = off / d;
var ismultiple = ((off % d) == 0);
return (d | (roundup ^ ismultiple)) & roundup;
}
Math.round(3/2);
2
roundToEven(3,2);
2