Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的四舍五入数字_Javascript_Rounding - Fatal编程技术网

javascript中的四舍五入数字

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

在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 = (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