官方说明:
返回从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.Mod
和Number.IntegerDivide
,由于语法类似,以上只放了其中一个函数的说明。
这两个函数本身比较简单,Number.Mod
为两数相除取余,对应工作表函数中的MOD;而Number.IntegerDivide
为两数相除后取整,对应工作表函数中两数相除后使用INT。
其中后者函数名比较长可能比较难记,又要背单词了。。。Integer表示整数,VBA中的整型也是用的这个单词;Divide表示划分也就是除法,DAX中的安全除法也是用的这个单词。可以发现不同语言中的英文单词用来用去也就那么几个,大多数都是相通的。
这两个函数语法一致,需要三个参数:第一参数为分子;第二参数为分母;第三参数为可选的精度,有两个枚举常量Precision.Double
和Precision.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 最大乘积
原理:每个最大数都是y=(m-x)x的最大值,开口向下的二次曲线,最高点-变量趋近于x/2时
2和3的最大乘積應該是1和2才對?
除非可以不拆