基于d3.js 不清楚也没关系
function calc(max, min, countHint){
span = max-min;
step = Math.pow(10, Math.floor(Math.log(span / countHint) / Math.LN10));
err = countHint / span * step;
// Filter ticks to get closer to the desired count.
if err <= .15 then step *= 10
else if err <= .35 then step *= 5
else if err <= .75 then step *= 2
return step;
}
calc(300,100,6);
有没有人看懂啊?为什么 求 step 这么复杂,到底在算什么?
Math.log(num) / Math.LN10
这个函数其他地方也出现过,是为了干嘛的?
log运算不知道吗- -
以10为低的log运算的含义不知道吗- -
就算不知道,不会试一下吗- -
吐槽啊
楼主,让你实现一个问题:给一个数n,求数n的位数。你会怎么写。
数学问题。
Math.log = ln
Math.LN10 = Math.log(10) = ln(10)
Math.log(num) / Math.LN10 = ln(num)/ln(10) = log_10(num) = lg(num)
Math.pow(10, Math.floor(Math.log(span / countHint) / Math.LN10)) = 10^(Math.floor((lg(num))) >= num;
关键在于Math.floor,可以将这个值变大一点。
首先说一下后一个问题,js里Math.log
是数学函数里的ln
,就以e为底的对数
,Math.log(num) / Math.LN10
就是算以10为底的对数
了,你可以参考一下换底公式
前一个问题看明白了step = Math.pow(10, Math.floor(Math.log(span / countHint) / Math.LN10));
算的是一个10^n
的step,实际的步长应该是间隔/总数,就是span / countHint
,于是把二者相除得到了err,判断err的值,而乘上一个相应的系数是为了让step
更接近span / countHint
,但是实际误差仍然可能会很大。最终目的是算一个x*10^n的步长,原因不明
这个 没有上下文 不知道什么意思 应该是某种意义上的步进值吧。