本章节介绍集算器中支持的数据类型及判断数据类型涉及到的函数。
在集算器中,有以下几种基本数据类型:
Ø 整数
32位整数,即-231~231-1之间的整数,其取值范围-2147483648~2147483647,可用类型转换函数int()将其它类型数据转换为32位整数。
Ø 长整数
64位整数,即-263~263-1之间的整数,比整数类型的取值范围更大,可用类型转换函数long()将其它类型数据转换为长整数。
特别的,可以在整数后面添加大写的L表示长整数,长整数与整数相比有更大的取值范围;还可以用0x开头的串来表示十六进制的长整数:
|
A |
1 |
123456789 |
2 |
123456789L |
3 |
12345678900 |
4 |
0x00FF |
由于普通整数的取值范围是-231~231-1,即-2147483648~2147483647,因此A1中的数值为整数,A2中在整数后面添加了L,则会被识别为长整数。A3中12345678900超出了普通整数的取值范围,会被自动解析为长整数。A4中是十六进制的单元格常数。A1,A2,A3和A4中的值如下:
在集算器中,数值类的数据在显示时都会靠右对齐,整数会用蓝色显示,而长整数会用黑色显示。
Ø 浮点数
64位浮点数,这是集算器中最常用的数据类型,涉及小数的运算基本都是用它来计算的,可用类型转换函数float()将其它类型数据转换为浮点数。由于浮点数是用二进制规则存储数据的,因此在计算中有可能出现误差。
|
A |
1 |
43.41 |
2 |
-4.45E13 |
3 |
3% |
4 |
=float(54) |
A1,A2,A3和A4中的值如下:
其中,A2中为用科学计数法表示的浮点数;A3中为百分数表示的浮点数,百分数的这种写法只能作为常数使用,而不能用在表达式中。如上面所示,浮点数在集算器中会显示为深粉色。
Ø 长实数
长实数可以无误差地存储任何十进制实数,但是使用长实数计算时,需要消耗更多的内存,且计算的效率较低。可用类型转换函数decimal()将其它类型数据(如字符串)转换为长实数。
|
A |
1 |
5.2 |
2 |
=A1*A1 |
3 |
=decimal("5.2") |
4 |
=A3*A3 |
A1中为浮点数5.2,A3中将字符串"5.2"转换为长实数。A2与A4中计算的结果如下:
可以看到,由于采用二进制处理,因此浮点数的运算可能造成精度误差,而长实数的计算没有这种情况。长实数运算后的结果仍然是长实数,在集算器中,长实数将显示为红色。
Ø 实数
实数包括整数、长整数、浮点数、长实数这四种类型,可用类型转换函数number()将其它类型数据转换为实数。
Ø 布尔型
包括true/false
|
A |
1 |
true |
2 |
false |
3 |
=4>2 |
4 |
=13%3==0 |
A1,A2,A3和A4中的结果如下:
Ø 字符串
在使用表达式时,用双引号括起来,其中转义字符用\。而在直接定义字符串常量时,不用引号,还可以用函数string()将其它类型的数据转换为字符串。在表达式中计算两个字符串x与y合并,可以在之间添加空格x y。在将两个字符串合并时,也可以直接用加法,写作x+y,但是此时x与y必须均为字符串,如果其中之一为实数,结果即为实数而不是字符串。如果需要将实数作为字符串,与其它字符串连接,可以用x/y,来计算,此时如果x与y其中之一为字符串,结果即为字符串。
字符串转义规则与JAVA相同,可参考使用手册。
|
A |
1 |
Amy |
2 |
="State:\tTX" |
3 |
="Texas" "Dallas" |
4 |
=A1+3.14 |
5 |
=A1/3.14 |
A1,A2,A3,A4和A5中的结果如下:
Ø 日期/时间
写成yyyy-mm-dd和hh:mm:ss形式。可以用类型转换函数date(),time()和datetime()将字符串或者长整数转换为日期,时间或者日期时间类型。
|
A |
1 |
2014-10-5 |
2 |
22:15:30 |
3 |
=date("2014" "-10" "-5") |
A1,A2和A3中的结果如下:
其中,A3中的date函数除了可以将字符串转换为日期外,也可以直接设定日期的年月日,如改写为date(2014,10,5) 将得到相同的结果。
集算器中,布尔型、字符串及日期时间数据,都会靠左对齐,显示为黑色。
可以在菜单栏的工具选项中,点击选项按钮,在环境选项卡中,设定时间/日期数据的格式,以及字符编码等。
注意,当把数据转换为其它类型时,有可能会丢失精度。
Ø 排号
排号类型的数据类似整数,却是按字节来存储的,并可以指定其存储时所占用的字节数,排号数据目前只允许使用16个字节,即128位。排号类型的数据通常可以用作表的键值,只能进行比较,而不能参与其它计算。排号类型的数据在比较时并不是直接比较整数值,而是逐个字节来比较大小。
|
A |
B |
1 |
=k(1111:2) |
|
2 |
=A1.sbs(1) |
|
3 |
=k(1111:4) |
|
4 |
=[A3.sbs(1),A3.sbs(2),A3.sbs(3),A3.sbs(4)] |
=k(0,0,4,87) |
5 |
=A3==B4 |
=A3==A1 |
6 |
=k(111,0,0,4,0,0,0,87,0,87) |
=k(133,255,0,128,0,0,0,0) |
7 |
=A6<B6 |
=k(A6.sbs(5), A6.sbs(3:4):2, A6.sbs(8)) |
A1中用k(ni: li) 函数生成排号,后面的长度代表整数所占用的字节数,如A1中使用整数1111来生成2个字节的排号数据,值如下:
在查看单元格时,排号数据会逐位显示为16进制模式。A1中1111占用2个字节,每个字节会显示为2个16进制数字,1111对应16进制的0457。
用k.sbs(n)可以取出排号数据的某个字节构成的整数,A2中取出排号A1的第一个字节构成的整数,这里第1个字节的16进制数为04,转换为10进制的整数如下:
在A3中,同样用整数1111生成排号数据,但占用4个字节。A4中查看A3各个字节的数据情况。也可以直接用k(ni,…) 指定多个字节的值来生成排号数据,如果不设参数li,表示每个整数依次只对应1个字节。A3、A4、B4中的结果如下:
比较A3和A1中的结果,由于这里设置的1111占用4个字节,因此显示为16进制是8个数字的00000457。其中,第4个字节在16进制中为57,转换为10进制为87,正如A4的结果中所示。B4中按单字节设置排号,结果和A3是相同的。
在A5和B5中,用A3中的排号与B4和A1中的排号作对比,可以发现,B4中生成的排号与A3中是相同的,而不同长度的排号数据,即使显示的值相同,也是不同的排号数据。A5和B5中的比较结果如下:
在直接用k(ni,…) 生成排号数据时,注意其中每个字节的值都是整数,最小是0,最大是255,同时最多指定16个字节,由于单字节数据的取值范围是0~255,所以只有这个范围内的设置才是正常的,超过这个范围ni只有最后一个字节对应数据有效。A6和B6中生成的排号数据如下:
由于排号数据的比较是逐个字节来比较的,因此B6中的排号数据是比较大的。同时注意,排号数据都是16个字节,比较时会依次比较,与定义时指定了几个字节值并没有关系。本例中A6定义了10个字节,A7中定义了8个,仍然是可以比较的,A7中的结果如下:
除了使用k(n,…)生成指定各字节值的排号之外,还可以用k(n:l,…),依次指定一个或多个字节构成排号数据。B7中生成的数据如下:
实际上,B7中的表达式和B4中的表达式k(0,0,4,87) 作用是类似的,只不过中间两个字节的数据是同时指定的,而且数据都是A6的排号中获取的。
可以用下面几个函数判断数据的类型:
Ø ifnumber(x)
判断x是否是实数
Ø ifstring(x)
判断x是否是字符串
Ø ifdate(x)
判断x是否是日期类型或日期时间类型
Ø iftime(x)
判断x是否是时间类型
|
A |
1 |
=ifnumber(3.5) |
2 |
=ifstring(now()) |
A1中,3.5是浮点数,属于实数。A2中now()函数计算当前日期时间,结果不是字符串。A1和A2中的结果如下: