Math.log10 javascript polyfill

Math.log10 javascript polyfill,javascript,Javascript,如以下所述,polyfill可用于Math.log10: Math.log10 = Math.log10 || function(x) { return Math.log(x) / Math.LN10; }; 不幸的是,由于浮点运算(在非本机实现中),这: 将导致: => 5.999999999999999 解决此问题的一种方法是进行舍入: rounding_const = 1000000; function log10(n) { return Math.round(roun

如以下所述,polyfill可用于
Math.log10

Math.log10 = Math.log10 || function(x) {
  return Math.log(x) / Math.LN10;
};
不幸的是,由于浮点运算(在非本机实现中),这:

将导致:

=> 5.999999999999999
解决此问题的一种方法是进行舍入:

rounding_const = 1000000;

function log10(n) {
  return Math.round(rounding_const * Math.log(n) / Math.LN10) / rounding_const;
}

有没有一种更好的方法(算法?)不涉及不规则的舍入?

你可以这样做,但我不知道这是否比舍入更好

Math.log10 = Math.log10 || function(value){
  var v = +value, s;
  if(v > 0 && /^(?:10*|0\.0*1)$/.test(s = ""+v)){
    return v < 1? 
      2 - s.length:
      s.length - 1;
  }
  return Math.log(v) / Math.LN10
}
Math.log10=Math.log10 | |函数(值){
var v=+值,s;
如果(v>0&&/^(?:10*| 0\.0*1)$/.测试(s=”“+v)){
返回v<1?
2-s.长度:
s、 长度-1;
}
返回Math.log(v)/Math.LN10
}

顺便说一句,你的
舍入常数可以更高,大约在1e12到1e14之间,我想你可以用你的代码计算一个近似值,然后进行二进制搜索,直到达到所需的值。类似这样的东西(可能可以改进)

函数日志(x){
var aprox=Math.log(x)/Math.LN10,
数值=数学功率(10,近似值);
如果(值===x)返回近似值;
如果(值x){
var lower=aprox*.99999999,
lowerval=数学功率(10,更低),
上限=大约,
upperval=值;
}否则{
回程票;
}
var迭代次数=1e3;
对于(变量i=0;i x){
上=中,
upperval=middleval;
}否则{
返回中间;
}
}
返回(上+下)/2;
};
日志(1000000);//6.
Math.log10=函数(x){
如果(!(x>0&&x<1/0)){
返回Math.log(x)*Math.LOG10E;
}
var n=Math.round(Math.log(Math.min(Math.max(x,10/Number.max\u值),Number.max\u值/10))*Math.LOG10E);
返回n+Math.log(x/Math.pow(10,n))*Math.LOG10E;
};

5.999999999
结果可能产生的负面影响是什么?换句话说,您是如何使用它的?您使用的是浮点,您应该期望有一点不准确,并且能够处理它。
Math.log10 = Math.log10 || function(value){
  var v = +value, s;
  if(v > 0 && /^(?:10*|0\.0*1)$/.test(s = ""+v)){
    return v < 1? 
      2 - s.length:
      s.length - 1;
  }
  return Math.log(v) / Math.LN10
}
function log(x) {
  var aprox = Math.log(x) / Math.LN10,
      value = Math.pow(10, aprox);
  if(value === x) return aprox;
  if(value < x) {
    var lower = aprox,
        lowerval = value,
        upper = aprox * 1.00000000001,
        upperval = Math.pow(10, upper);
  } else if(value > x) {
    var lower = aprox * .99999999999,
        lowerval = Math.pow(10, lower),
        upper = aprox,
        upperval = value;
  } else {
    return aprox;
  }
  var iterations = 1e3;
  for(var i=0; i<iterations; ++i) {
     var middle = (upper+lower) / 2,
         middleval = Math.pow(10, middle);
    if(middleval < x) {
      lower = middle;
      lowerval = middleval;
    } else if(middleval > x) {
      upper = middle,
      upperval = middleval;
    } else {
      return middle;
    }
  }
  return (upper+lower) / 2;
};
log(1000000); // 6
Math.log10 = function (x) {
  if (!(x > 0 && x < 1 / 0)) {
    return Math.log(x) * Math.LOG10E;
  }
  var n = Math.round(Math.log(Math.min(Math.max(x, 10 / Number.MAX_VALUE), Number.MAX_VALUE / 10)) * Math.LOG10E);
  return n + Math.log(x / Math.pow(10, n)) * Math.LOG10E;
};