Number.Mod/IntegerDivide

官方说明:

返回从number整除divisor所得的余数。如果number或divisor为null,则Number.Mod返回null。
number:被除数。
divisor:除数。
Number.Mod( number as nullable number, divisor as nullable number, optional precision as nullable number) as nullable number
 

解读:

本文将介绍2个函数,分别为Number.ModNumber.IntegerDivide,由于语法类似,以上只放了其中一个函数的说明。
这两个函数本身比较简单,Number.Mod为两数相除取余,对应工作表函数中的MOD;而Number.IntegerDivide为两数相除后取整,对应工作表函数中两数相除后使用INT。
其中后者函数名比较长可能比较难记,又要背单词了。。。Integer表示整数,VBA中的整型也是用的这个单词;Divide表示划分也就是除法,DAX中的安全除法也是用的这个单词。可以发现不同语言中的英文单词用来用去也就那么几个,大多数都是相通的。
这两个函数语法一致,需要三个参数:第一参数为分子;第二参数为分母;第三参数为可选的精度,有两个枚举常量Precision.DoublePrecision.Decimal,分别为双精度和十进制的意思,可以分别用0和1代替,但是暂时没发现有什么用所以一般省略不填。
比如7除以4等于1余3,所以= Number.IntegerDivide(7,4)返回1,= Number.Mod(7,4)返回3,这很好理解。
函数虽然非常简单,但用法却不简单,在此举两个稍微复杂一些的案例:
 

现有产品库存如左表,按50个一箱装箱发货,需要得到分箱后每一箱的实际数量。
这个思路还比较简单,除以50取整得到箱数,不足50个的取余单独分一箱,再对余数为0的情况做个特殊处理,关键在于如何构建list。

let
    源 = Excel.CurrentWorkbook(){[Name="产品"]}[Content],
    装箱 = Table.AddColumn(源, "箱", each List.Repeat({50},Number.IntegerDivide([数量],50))&[a={Number.Mod([数量],50)},b=if a={0} then {} else a][b]),
    展开 = Table.ExpandListColumn(装箱, "箱")
in
    展开

 
再来看一个更难的:

最优化问题,将一个整数拆分使其乘积最大。这是算法题,直接上代码,至于为什么这么做有兴趣的自己研究,讲也讲不清楚。

let
    max= (x)=>
	if x<=4
	then x
	else 
		(
		if	Number.Mod(x,2)=0
		then 	Number.Power(3,Number.IntegerDivide(x,6)*2)*Number.Power(2,Number.IntegerDivide(Number.Mod(x,6),2))
		else	Number.Power(3,Number.IntegerDivide(x-3,6)*2+1)*Number.Power(2,Number.IntegerDivide(Number.Mod(x-3,6),2))
		),
    整数 = Excel.CurrentWorkbook(){[Name="整数"]}[Content],
    最大乘积 = Table.AddColumn(整数, "最大乘积", each max([整数]))
in
    最大乘积

2 Replies to “Number.Mod/IntegerDivide”

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注