*一串不重复的数字,并且从小到大排列,如何比较快捷的判断出其中有哪几组数字是连续的,并且取出每组的两头值?
*如:1,3,6,8,9,10,12,15,20,23,24,25,26,30,33,34,35,36,37,38,39,40
*变成:1,3,6,8-10,12,15,20,23-26,30,33-40

avaScript中的 Math 对象主要用于数学运算。

澳门新葡萄京官网注册 1

Clear
lcStr="1,3,6,8,9,10,12,15,20,23,24,25,26,30,33,34,35,36,37,38,39,40"
nRow=Alines(Astr,Strtran(lcStr,",",Chr(13)+Chr(10)))
lcStr1=""
lnNum1=-1
For lnI=1 to nRow
    lnNum=Int(Val(Astr[lnI]))-lnI
    If lnNum1=lnNum
        lcStr1=Iif(Not "-"$Right(lcStr1,Len(cStr)+1),lcStr1,Left(lcStr1,Len(lcStr1)-Len(cStr)-1))+"-"+Astr[lnI]
    Else
        lcStr1=lcStr1+Iif(Empty(lcStr1),"",",")+Astr[lnI]
    EndIf
    cStr=Astr[lnI]
    lnNum1=lnNum
EndFor
MessageBox(lcStr1)

这里介绍几个常用的数学运算,更多内容请参考:JavaScript Math
对象参考手册。

前几天翻阅《JavaScript权威指南》,看到了Math对象,于是汇总了一下。

对上面方法做了些改进,运行速度有所提高 (2015-03-16)

四舍五入

Math 对象的round()方法可把一个数字四舍五入为最接近的整数。

语法:

Math.round(x)

其中,x 是要进行四舍五入的数字。

例如:

澳门新葡萄京官网注册 2

澳门新葡萄京官网注册,Math对象不同于其他的对象,它可以说是一个公共数学类,里面有很多数学方法,用于各种数学运算,但是Math对象不需要构造,对于其中的方法直接使用即可。

Clear
lcStr="1,3,6,8,9,10,12,15,20,23,24,25,26,30,33,34,35,36,37,38,39,40"
nRow=Alines(Astr,Strtran(lcStr,",",Chr(13)+Chr(10)))
lcStr1=""
lnNum1=-1
cStr=""
For lnI=1 to nRow
    lnNum=Int(Val(Astr[lnI]))-lnI
    If lnNum=lnNum1
        cStr=Astr[lnI]
    Else
        If Not Empty(cStr)
            lcStr1=lcStr1+"-"+cStr
            cStr=""
        Endif
        lcStr1=lcStr1+Iif(Empty(lcStr1),"",",")+Astr[lnI]
    EndIf
    lnNum1=lnNum
EndFor
If Not Empty(cStr)
    lcStr1=lcStr1+"-"+cStr
    cStr=""
EndIf
MessageBox(lcStr1)

1、常量(即属性)

向下取整(下舍入)

Math
对象的floor()方法可以对一个数字进行向下取整运算。它返回一个小于或等于该数字,并且与之最接近的整数。

例如:

澳门新葡萄京官网注册 3

结果:

0

2

5

-1

-2

-6

澳门新葡萄京官网注册 4

方法三(2015-04-01)

向上取整(上舍入)

Math
对象的ceil()方法可以对一个数字进行向上取整运算。它返回一个大于或等于该数字,并且与之最接近的整数。

澳门新葡萄京官网注册 5

结果:

1

2

6

-0

-2

-5

随机数

通过 Math 对象的random()方法可以返回一个介于0 ~ 1之间的随机数。

语法:

Math.random()

请看下面的几个例子。

返回 0 ~ 10 之间的随机数(整数):

澳门新葡萄京官网注册 6

返回1~10之间的随机数(整数):

澳门新葡萄京官网注册 7

返回 10 ~ 100 之间的随机数(整数):

澳门新葡萄京官网注册 8

 

Aa="1,3,6,8,9,10,12,15,20,23,24,25,26,30,33,34,35,36,37,38,39,40"
nRow=Alines(AcStr,Chrtran(Aa,",",Chr(13)+Chr(10)))
Store AcStr[1] To cStr,lcStr
For lnI=2 To nRow
    If Val(AcStr[lnI])-Val(cStr)=1
        lcStr=Iif("-"+cStr$lcStr,Strtran(lcStr,"-"+cStr,"-"+AcStr[lnI]),lcStr+"-"+AcStr[lnI])
    Else
        lcStr=lcStr+","+AcStr[lnI]
    EndIf
    cStr=AcStr[lnI]
EndFor
MessageBox(lcStr)

下面是它们的值:

方法四
(2015-04-15)

document.write("Math.E = "+Math.E+"<br>");
document.write("Math.LN2 = "+Math.LN2+"<br>");
document.write("Math.LN10 = "+Math.LN10+"<br>");
document.write("Math.LOG2E = "+Math.LOG2E+"<br>");
document.write("Math.LOG10E = "+Math.LOG10E+"<br>");
document.write("Math.PI = "+Math.PI+"<br>");
document.write("Math.SQRT1_2 = "+Math.SQRT1_2+"<br>");
document.write("Math.SQRT2 = "+Math.SQRT2+"<br>");
输出结果:
Math.E = 2.718281828459045
Math.LN2 = 0.6931471805599453
Math.LN10 = 2.302585092994046
Math.LOG2E = 1.4426950408889634
Math.LOG10E = 0.4342944819032518
Math.PI = 3.141592653589793
Math.SQRT1_2 = 0.7071067811865476
Math.SQRT2 = 1.4142135623730951
Clear
lcStr="1,3,6,8,9,12,15,20,23,24,25,26,30,33,34,35,36,37,38,39,40"
lcStr=lcStr+",|"
nRow=Alines(Astr,Strtran(lcStr,",",Chr(13)+Chr(10)))
cStr1=Astr[1]
lcStr1=cStr1
lcStr2=""
For lnI=2 To nRow
    If Val(Astr(lnI))=Val(cStr1)+1
        lcStr2="-"+Astr(lnI)
    Else
        lcStr1=lcStr1+lcStr2+","+Astr(lnI)
        lcStr2=""
    EndIf
    cStr1=Astr(lnI)
EndFor
MessageBox(left(lcStr1,len(lcStr1)-2),0,"显示结果")

2、abs() 方法可返回数的绝对值

方法五
(2015-04-06)

Math.abs(x);x必须为一个数值,此数可以是整数,小数都可以
document.write(Math.abs(-2.77));//输出2.77

Clear
lcStr="1,3,6,8,9,12,15,20,23,24,25,26,30,33,34,35,36,37,38,39,40"
nRow=Alines(Astr,Strtran(lcStr,",",Chr(13)+Chr(10)))
dimension astr(alen(astr),1)
create cursor test (Num N(2))
insert into test from array astr
select min(Num) nmin,max(num) nmax,Num-recno() nid,iif(min(Num)=max(Num),transform(min(Num)),transform(min(Num))+"-"+transform(max(Num)))+space(10) from test group by nid into array Atemp

lcstr=Atemp[1,4]
for lnI=2 to alen(Atemp,1)
    lcStr=lcStr-","-Atemp[lnI,4]
endfor
messagebox(alltrim(lcstr))

3、acos(x) 返回数的反余弦值。

Math.acos(x);x必须是 -1.0 ~ 1.0 之间的数
如果x不在上述范围,则返回NaN

4、asin() 方法可返回一个数的反正弦值。

Math.asin(x);x必须是一个数值,该值介于 -1.0 ~ 1.0 之间。
如果参数 x 超过了 -1.0 ~ 1.0 的范围,那么浏览器将返回 NaN。

5、atan() 方法可返回数字的反正切值。

Math.atan(x);x 必需。必须是一个数值。
返回的值是 -PI/2 到 PI/2 之间的弧度值。

6、atan2() 方法可返回从 x 轴到点 (x,y) 之间的角度。

Math.atan2(y,x)
-PI 到 PI 之间的值,是从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。

7、ceil() 方法可对一个数进行上舍入。

什么是上舍入?即大于等于 x,并且与它最接近的整数。
Math.ceil(x);x 必需。必须是一个数值。

document.write(Math.ceil(0.60) + "<br />")
document.write(Math.ceil(0.40) + "<br />")
document.write(Math.ceil(5) + "<br />")
document.write(Math.ceil(5.1) + "<br />")
document.write(Math.ceil(-5.1) + "<br />")
document.write(Math.ceil(-5.9))
输出为:
1
1
5
6
-5
-5
对于负数,向下取值,你懂的

8、cos() 方法可返回一个数字的余弦值。

Math.cos(x);x 必需。必须是一个数值。 返回的是 -1.0 到 1.0
之间的数。、
x其实要求是输入一个弧度值,例如—>
π代表的是180°等,π即Math.PI
document.write(Math.cos(Math.PI));
输出为-1

但是假如:

document.write(Math.cos(Math.PI/2));
输出为:6.123233995736766e-17

document.write(Math.cos(Math.PI/3));
输出为:0.5000000000000001

为什么会出现这些怪异的数字呢?

其实大家都知道document.write(Math.cos(Math.PI/2));应该输出0,而在Javascript中可能没有求的0,所以就用了一个非常非常小的数代替
类似的document.write(Math.cos(Math.PI/3));应该是0.5才对,但是却在最后面多了一位
这些是小问题,没啥好说的,本身寄存器就不可能表示所有数的,因此在计算过程中出现差错也很正常

9、exp() 方法可返回 e 的 x 次幂的值。

Math.exp(x);x 必需。任意数值或表达式。被用作指数。
返回 e 的 x 次幂。e 代表自然对数的底数,其值近似为 2.71828。
document.write(Math.exp(1) + “<br />”);//输出2.718281828459045

10、floor() 方法可对一个数进行下舍入。

和ceil()方法相对应,floor()方法是对一个数进行下舍入,即小于等于 x,且与
x 最接近的整数。
Math.floor(x);

document.write(Math.floor(0.60) + "<br />")
document.write(Math.floor(0.40) + "<br />")
document.write(Math.floor(5) + "<br />")
document.write(Math.floor(5.1) + "<br />")
document.write(Math.floor(-5.1) + "<br />")
document.write(Math.floor(-5.9))
输出为:
0
0
5
5
-6
-6
对于负数,向上取值,你懂的

11、log() 方法可返回一个数的自然对数。

Math.log(x);//参数 x 必须大于 0,大于0则结果为NaN,等于0则为-Infinity

document.write(Math.log(2.7183) + "<br />")
document.write(Math.log(2) + "<br />")
document.write(Math.log(1) + "<br />")
document.write(Math.log(0) + "<br />")
document.write(Math.log(-1))
输出为:
1.0000066849139877
0.6931471805599453
0
-Infinity
NaN

12、max() 方法可返回两个指定的数中带有较大的值的那个数。

Math.max(x…),//x 为0或多个值。在 ECMASCript v3
之前,该方法只有两个参数。
返回值:
参数中最大的值。
如果没有参数,则返回 -Infinity。
如果有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。
如下例:

document.write(Math.max(5,3,8,1));//8
document.write(Math.max(5,3,8,'M'));//NaN
document.write(Math.max(5));//5
document.write(Math.max());//-Infinity

13、min() 方法可返回指定的数字中带有最低值的数字。

Math.min(x,y);x为0或多个值。在 ECMASCript v3
之前,该方法只有两个参数。
返回值:
参数中最小的值。
如果没有参数,则返回 Infinity。
如果有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。
和max()方法使用类似

14、pow() 方法可返回 x 的 y 次幂的值。

Math.pow(x,y);//
x 必需。底数。必须是数字。
y 必需。幂数。必须是数字。
返回值:
如果结果是虚数或负数,则该方法将返回
NaN。如果由于指数过大而引起浮点溢出,则该方法将返回 Infinity。
如下例:

document.write(Math.pow()+'<br>');
document.write(Math.pow(2)+'<br>');
document.write(Math.pow(2,2)+'<br>');
document.write(Math.pow(2,2,2)+'<br>');
document.write(Math.pow('M',2)+'<br>');
输出:
NaN
NaN
4
4
NaN

15、random() 方法可返回介于 0 ~ 1 之间的一个随机数。

Math.random();//无参
返回:
0.0 ~ 1.0 之间的一个伪随机数。
何为伪随机数?
真正意义的随机数是某次随机事件产生的结果,经过无数次后表现为呈现某种概率论,它是不可预测的
而伪随机数是根据伪随机算法实现的,它是采用了一种模拟随机的算法,因此被称为伪随机数

document.write(Math.random())//0.12645312909485157

16、round() 方法可把一个数字舍入为最接近的整数。

Math.round(x),x 必需。必须是数字。
对于 0.5,该方法将进行上舍入。
例如,3.5 将舍入为 4,而 -3.5 将舍入为 -3。
其实就感觉此方法是用ceil()和floor()方法结合实现的

document.write(Math.round(0.60) + "<br />")
document.write(Math.round(0.50) + "<br />")
document.write(Math.round(0.49) + "<br />")
document.write(Math.round(-4.40) + "<br />")
document.write(Math.round(-4.60))
输出为:
1
1
0
-4
-5
对于负数,则和整数取值相反

17、sin() 方法可返回一个数字的正弦。

Math.sin(x),x 必需。一个以弧度表示的角。将角度乘以 0.017453293
(2PI/360)即可转换为弧度。
返回值:
参数 x 的正弦值。返回值在 -1.0 到 1.0 之间。

document.write(Math.sin(3) + "<br />")
document.write(Math.sin(-3) + "<br />")
document.write(Math.sin(0) + "<br />")
document.write(Math.sin(Math.PI) + "<br />")
document.write(Math.sin(Math.PI/2)
输出为:
0.1411200080598672
-0.1411200080598672
0
1.2246063538223772e-16
1

18、sqrt() 方法可返回一个数的平方根。

Math.sqrt(x);//x 必需,必须是大于等于 0 的数。
返回值:
参数 x 的平方根。如果 x 小于 0,则返回 NaN。
它相当于Math.pow(x,0.5);

19、tan() 方法可返回一个表示某个角的正切的数字。

Math.tan(x),//x 必需。一个以弧度表示的角。将角度乘以 0.017453293
(2PI/360)即可转换为弧度。

 

下面再再列举一些ES6中,我觉得常用的Math方法。

1.trunc()方法用于去除一个数的小数部分,返回整数部分。

Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0
Math.trunc('123.456')// 123

对于字符串数字,Math.trunc内部使用Number方法将其先转为数值。

2.sign()方法用来判断一个数是正数、负数、还是零。

它会返回五种值。

  • 参数为正数,返回+1;
  • 参数为负数,返回-1;
  • 参数为0,返回0;
  • 参数为-0,返回-0;
  • 其他值,返回NaN。

  

Math.sign(-5) // -1
Math.sign(5) // +1
Math.sign(0) // +0
Math.sign(-0) // -0
Math.sign(NaN) // NaN
Math.sign('foo'); // NaN
Math.sign();      // NaN

3.cbrt()用来计算一个数的立方根。

Math.cbrt(-1) // -1
Math.cbrt(0)  // 0
Math.cbrt(1)  // 1
Math.cbrt(2)  // 1.2599210498948734

 


大概常用到的就以上这些了,如果经常做图像处理的话,三角函数是必须掌握的,拿起高中的课本复习一下吧。

澳门新葡萄京官网注册 9