第5章

逻辑与数值函数




在众多的数值类函数中,大多数函数的使用频率不高。使用频率较高的数值类函数主要有Number.From()、Number.FromText()、Number.Round()、Number.ToText()等几个。
5.1逻辑函数
Power Query的逻辑函数目前有3个: Logical.From()、Logical.FromText()、Logical.ToText()。
5.1.1Logical.From()
Logical.From()函数用于从某个值返回逻辑值,语法如下: 


Logical.From(value as any) as nullable logical





说明: 当给定值为null时,返回null; 当给定值为逻辑值、数值、文本型"true"或"false"时(不区分大小写),则返回值为true或false。
应用举例,代码如下: 


= Logical.From(null)// null



= Logical.From(Text.Length("2021"))	//true



= Logical.From(2000+21) 		//true



= Logical.From(Logical.From(2021) and true)//true



= Logical.From("A" = "a" and 3=3)	//false



= Logical.From("A" = "a" or 3=3) 	//true






= Logical.From("False")		// false



= Logical.From("True")		// true




"true" 或 "false"之外的文本是不可以转换为逻辑值的。当逻辑值来自"true"或"false"之外的其他文本时,返回值会报错,代码如下: 


Logical.From("A")




报错提示: 


Expression.Error: 无法转换为 Logical。

详细信息:

A




5.1.2Logical.FromText()
Logical.FromText()函数用于从文本值返回逻辑值true或false,语法如下: 


Logical.FromText(text as nullable text) as nullable logical





说明: 文本只能是文本型"true" 或 "false"(不区分大小写),代码如下: 


= Logical.FromText("False")// false



= Logical.FromText("True")		// true




如果 text为其他字符串,则会报错,代码如下: 


= Logical.FromText("A")




报错提示: 


Expression.Error: 无法转换为 Logical。

详细信息:

A




5.1.3Logical.ToText()
Logical.ToText()函数用于从逻辑值返回文本值,语法如下: 


Logical.ToText(logicalValue as nullable logical) as nullable text





应用举例,代码如下: 


= Logical.ToText(true) //true




5.2常用数值函数
5.2.1判断
1. Number.IsNaN()

NaN是Not a Number的英文简写,它是计算机语言中的数据类型之一,表示未定义或不可表示的值。例如,对NaN值的四则运算; 对正负无穷大值的四则运算; 对负数的开偶次方等,这些运算都将返回NaN值,代码如下: 


= Number.IsNaN(0/0)//true



= Number.IsNaN(1/0)			//false



= Number.IsNaN(Number.NaN + Number.NaN)//true



= Number.IsNaN(2021 + Number.NaN)	//true




2. Number.IsEven()
Even是能被2整除的偶数,例如,个位数为0、2、4、6、8的自然数都是偶数。IsEven表示用以判断它是不是偶数,返回的值为true或false,代码如下: 


= Number.IsEven(2021) //false



= Number.IsEven(2022)	//true




3. Number.IsOdd()
Odd是不能被2整除的奇数,例如,个位数为1、3、5、7、9的自然数都是奇数。IsOdd表示用以判断它是不是奇数,返回的值为true或false,代码如下: 


= Number.IsOdd(2021)//true



= Number.IsOdd(2022)	//false




4. Number.Sign()
Sign中文是“符号”的意思。在很多计算机语言中,Sign函数常用来表示“数学符号”函数。如果数值为正数,则返回1; 如果数值为负数,则返回-1; 如果数值为0,则返回0; 如果值为null,则返回null,代码如下: 


= Number.Sign(-2021)//-1



= Number.Sign(2021)		//1



= Number.Sign(0)		//0



= Number.Sign(null)		//null




5.2.2随机数
1. Number.Random()

Random中文是“随机”的意思。在大多数计算机语言中,Random函数常用来生成“介于0~1的随机数”,代码如下: 


= Number.Random()//0.39867571527076684




2. Number.RandomBetween()
Between中文是“介于”的意思,意味着其有“起、止”数据范围; Number.RandBetween()函数用于返回介于“起、止”范围间的随机数,代码如下: 


= Number.RandomBetween(6, 12)//9.53216271732569





注意:   Excel的Randbetween()函数生成的是随机整数,它与Number.RandBetween()函数是有区别的。
5.2.3计算
1. Number.Abs()

Abs是Absolute的英文简写,中文是“绝对”的意思,Number.Abs()函数返回的是数据的绝对值,代码如下: 


= Number.Abs(-2021)//2021




2. Number.IntegerDivide()
Integer是“整数”的意思,Divide在数学中表示的是“除、除以”的意思,所以IntegerDivide代表的是“整除”。Number.IntegerDivide()函数共有三个参数: 第一个参数为被除数,第二个参数为除数,第三个参数为可选参数。如果第一个参数或第二个参数为null,则函数返回的值为null,代码如下: 


= Number.IntegerDivide(8, 4)//2






= Number.IntegerDivide(9, 4)//2



= Number.IntegerDivide(9.3, 4)//2



= Number.IntegerDivide(9.3, null) //null




3. Number.Mod()
Number.Mod()函数用于返回整除后的余数,代码如下: 


= Number.Mod(8, 4)//0



= Number.Mod(9, 4)//1



= Number.Mod(9.3, 4)//1.3000000000000007



= Number.Mod(9.3, null) //null




4. Number.Power()
Power在数学中代表的是“幂、乘方”的意思。Number.Power()函数共两个参数,第一个参数为基数,第二个参数为指数,代码如下: 


= Number.Power(2,4) //16



= Number.Power(2.05,4)//17.661006249999993




5. Number.Sqrt()
Sqrt是Square Root的英文简写,是“平方根”的意思。Number.Sqrt()函数只有一个参数,代码如下: 


= Number.Sqrt(25)//5



= Number.Sqrt(36)//6




5.2.4舍入
1. Number.Round()

在计算机语言中,Round()函数多用于数值的四舍五入。Number.Round()函数有三个参数。第一个参数为必选参数,当第一个参数为null时,返回的值为null; 第二个和第三个参数为可选参数。第二个参数为小数点位数的指定,当小数点位数未指定时,返回的值为整数; 第三个参数为RoundingMode(舍入方向的指定),代码如下: 


= Number.Round(1.23)//1



= Number.Round(1.2345,2)  //1.23



= Number.Round(Number.Power(2.05,4),2)  //17.66,函数嵌套



= Number.Round(null) //null




以下是第三个参数RoundingMode的参数值说明: 
1)  RoundingMode.Up
参数值RoundingMode.Up表示向上舍入,也可以用代码0表示,代码如下:  


= Number.Round(1.2345,3,0)//1.235



= Number.Round(1.2345,3,RoundingMode.Up) //1.235



= Number.Round(-1.2345,3,0)//-1.234




2)  RoundingMode.Down
参数值RoundingMode.Down表示向下舍入,也可以用代码1表示,代码如下: 


= Number.Round(1.2345,3,1)//1.234 



= Number.Round(1.2345,3,RoundingMode.Down) //1.234



= Number.Round(-1.2345,3,1)//-1.235




3)  RoundingMode.AwayFromZero
参数值RoundingMode.AwayFromZero表示向远离0的方向舍入,也可以用代码2表示,代码如下: 


= Number.Round(1.2345,3,2)//1.235



= Number.Round(1.2345,3,RoundingMode.AwayFromZero) //1.235



= Number.Round(-1.2345,3,2)//-1.235




4)  RoundingMode.TowardZero
参数值RoundingMode.TowardZero表示向靠近0的方向舍入,也可以用代码3表示,代码如下: 


= Number.Round(1.2345,3,3)//1.234






= Number.Round(1.2345,3,RoundingMode.TowardZero) //1.234



= Number.Round(-1.2345,3,3)//-1.234




2. Number.RoundUp()
Number.RoundUp()函数为向上舍入函数,共两个参数。如果第一个参数为null,则返回的值为null; 第二个参数为可选参数,用于指定小数点的位数,代码如下: 


= Number.RoundUp(1.2345,3) //1.235



= Number.RoundUp(- 1.2345,3)//-1.234




Number.RoundDown()函数等效于Number.Round()函数,有使用第三个参数RoundingMode.Down的情形,代码如下: 


= Number.Round(1.2345,3,0)//1.235, 第三个参数的0代表RoundingMode.Up



= Number.Round(-1.2345,3,0) //-1.234




3. Number.RoundDown()
Number.RoundDown()函数为向下舍入函数,共两个参数。如果第一个参数为null,则返回的值为null; 第二个参数为可选参数,用于指定小数点的位数,代码如下: 


= Number.RoundDown(1.2345,3) //1.234



= Number.RoundDown(- 1.2345,3)//-1.235




Number.RoundDown()函数等效于Number.Round()函数,有使用第三个参数RoundingMode.Down的情形,代码如下: 


= Number.Round(1.2345,3,1) //第三个参数的1代表RoundingMode.Down



= Number.Round(-1.2345,3,1)




4. Number.RoundAwayFromZero()
Number.RoundAwayFromZero()函数为向远离0的方向舍入,“向上舍入正数、向下舍入负数”。当值≥0时,返回Number.RoundUp(value); 当值<0时,返回Number.RoundDown(value)。该函数共有两个参数。如果第一个参数为null,则返回的值为null; 第二个参数为可选参数,用于指定小数点的位数,代码如下: 


= Number.RoundAwayFromZero(1.2345,3)//1.235



= Number.RoundAwayFromZero (-1.2345,3)//-1.235




该函数等效于Number.Round()函数,有使用第三个参数RoundingMode.AwayFromZero的情形。
5. Number.RoundTowardZero()
Number.RoundTowardZero()函数为向靠近0的方向舍入。该函数共有两个参数。如果第一个参数为null,则返回的值为null; 第二个参数为可选参数,用于指定小数点的位数,代码如下: 


= Number.RoundTowardZero(1.2345,3)//1.234



= Number.RoundTowardZero(-1.2345,3)//-1.234




该函数等效于Number.Round()函数,有使用第三个参数RoundingMode.TowardZero的情形。
5.3不常用数值函数
5.3.1常量
1. Number.E


e是数学中自然对数的底数,是一个无限不循环小数。Number.E的常量值约为2.7182818284590451。
2. Number.PI
Pi是数学中的圆周率(π),是一个无限不循环小数。Number.PI的常量值约为3.1415926535897931。
3. Number.Epsilon
Number.Epsilon的常量值约为4.94065645841247E324。
4. Number.PositiveInfinity
正无穷大为大于0的有理数或无理数(符号为+∞),没有具体的数值,表示的是比任何一个数字都要大的值,它来自正数除以0的值(例如1/0)。
5. Number.NegativeInfinity 
负无穷大为小于0的有理数或无理数(符号为-∞),没有具体的数值,表示的是比任何一个数字都要小的值,它来自负数除以0的值(例如-1/0)。
5.3.2计算
在数学中: ln是以e为底的自然对数; lg是以10为底的常用对数; log是以任意数为底的一般对数,可以以任何大于0且不等于1的数为底; log10=lg10,ln=loge。
在M语言中,与对数相关的函数有Number.Ln()、Number.Exp()、Number.Log()、Number.Log10()。应用与示例如下: 


= Number.Log(10) = Number.Ln(10)//true



= Number.Log(Number.E) = Number.Ln(Number.E)//true




5.3.3三角函数
正弦(Number.Sin())、余弦(Number.Cos())、正切(Number.Tan())等是最常用的三角函数。其他与正弦定理相关的扩展函数有Number.Asin()、Number.Sinh()、Number; 与余弦定理相关的扩展函数有Number.Acos()、Number.Cosh(); 与正弦定理相关的扩展函数有Number.Atan()、Number.Atan2()、Number.Tanh()。
在日常工作与生活中,在依据起止地的经纬度而计算出两地的距离时需要用到三角函数。如图51所示,依据“发货地经度、发货地纬度、收货地经度、收货地纬度”计算两地的距离。



图51计算两地的距离



在Excel工作表的E2单元格中,依据经纬度测算两地直线距离(单位: 千米)的公式如下(为了便于阅读与理解,公式已被格式化): 


E2 = ROUND(

6371*

ACOS(1-

(

 POWER(

(

SIN((90-B2)*PI()/180)*COS(A2*PI()/180)-

SIN((90-D2)*PI()/180)*COS(C2*PI()/180)

),

 2)

+

 POWER(

(

SIN((90-B2)*PI()/180)*SIN(A2*PI()/180)-

SIN((90-D2)*PI()/180)*SIN(C2*PI()/180)





),

 2)

 +

 POWER(

(

COS((90-B2)*PI()/180)-COS((90-D2)*PI()/180)

),

 2)

)/2

),

1

) 




在Excel中,通过“数据”→“从表格”将数据(“表1”)导入Power Query,如图52所示。


图52数据源



在Power Query编辑器中,选择“添加列”→“自定义列”。在“自定义列”对话框中输入计算公式,在高级编辑器中查看到的完整代码如下: 


//ch503-022

let

源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],



两地距千米 = Table.AddColumn(

源, 

"两地距离", each 

Number.Round(

6371*//地球的半径为6371千米

Number.Acos(1-

(

Number.Power(

(

Number.Sin((90-[发货地纬度])*Number.PI/180)*

Number.Cos([发货地经度]*Number.PI/180)

-

Number.Sin((90-[收货地纬度])*Number.PI/180)*

Number.Cos([收货地经度]*Number.PI/180)

),

2)





+

Number.Power(

(

Number.Sin((90-[发货地纬度])*Number.PI/180)*

Number.Sin([发货地经度]*Number.PI/180)

-

Number.Sin((90-[收货地纬度])*Number.PI/180)*

Number.Sin([收货地经度]*Number.PI/180)

),

2)

+

Number.Power(

(

Number.Cos((90-[发货地纬度])*

Number.PI/180)-Number.Cos((90-[收货地纬度]

)

*Number.PI/180)

),

2)

)/2

),

1

)

)



in

两地距千米




两地距离的单位为千米,返回值如图53所示。


图53两地距离

5.4数值转换函数
5.4.1Number.From()

Number.From()函数用于从某个值返回一个数值。该函数共有两个参数,第二个参数为可选参数,用于区域指定,语法如下: 


Number.From(

value as any,

//第一个参数可为逻辑值、文本数值、日期、日期时间、日期时区时间、时间、持续时间

optional culture as nullable text

) as nullable number




该函数的用法较为简单,例如Number.From("12")返回的值为12。
5.4.2Number.FromText()
Number.FromText()函数用于从文本值返回一个数值。第一个参数只能为文本数值,不可以为“逻辑值、日期、日期时间、日期时区时间、时间、持续时间”。
5.4.3Number.ToText()
Number.ToText()函数用于根据format指定的格式,将数值number格式化为文本值。该函数共有三个参数,其中第二个参数和第三个参数为可选参数。第二个参数的格式是单个字符代码,后面可能带一个数字精度说明符,第三个参数是区域语言选项,语法如下: 


Number.ToText(

number as nullable number, 

optional format as nullable text, 

optional culture as nullable text

) as nullable text




第二个参数的格式代码及用途如表51所示。


表51格式代码与用途说明




参 数 代 码用途

"D"或"d"(十进制)将结果格式化为整数。精度说明符控制输出中的位数
"E"或"e"(指数/科学)指数表示法。精度说明符控制最大小数的位数(默认值为6)
"F"或"f"(固定点)整数和小数位
"G"或"g"(常规)固定点或科学记数法的最简洁形式
"N"或"n"(数字)带组分隔符和小数分隔符的整数和小数位
"P"或"p"(百分比)乘以100并显示百分号的数字
"R"或"r"(往返)可往返转换同一数字的文本值。将忽略精度说明符
"X"或"x"(十六进制)十六进制文本值

1. 参数为"D"
第二个参数以代码D为例,将结果格式化为整数,代码如下: 


= Number.ToText(10, "D")//10





第一个参数必须为整数数值,如果值为文本型数值,则会报错,代码如下: 


= Number.ToText("10","d")




错误提示如下: 


Expression.Error: 无法将值 "10" 转换为类型 Number。

详细信息:

Value=10

Type=[Type]




如果第一个参数为带小数点的数值,则将返回错误提示,代码如下: 


= Number.ToText(10.6, "D")




错误提示如下: 


Expression.Error: 应为整数值。

详细信息:

10.6




2. 参数为"f"


= Number.ToText(12.345, "f1")//12.3



= Number.ToText(12.345, "f2")//12.35



3. 参数为"P"


= Number.ToText(0.12345, "P1")//12.3%



= Number.ToText(0.12345, "P2")//12.35%




4. 参数为"n"


= Number.ToText(12345.6789, "n")//12,345.68



= Number.ToText(12345.6789, "n1")//12,345.7



= Number.ToText(12345.6789, "n3")//12,345.679




5. 参数为"g"


= Number.ToText(12345.6789, "g")//12345.6789







= Number.ToText(12345.6789, "g1")//1e+04



= Number.ToText(12345.6789, "g2")//1.2e+04




6. 手动指定格式


= Number.ToText(12345.6789,"0.0") //12345.7,一位小数



= Number.ToText(12345.6789,"0.0%")//1234567.9%,一位小数的百分比



= Number.ToText(12345.6789,"0000.00") 

//12345.68,数位补全(如整数不足4位,则用0补充显示)