一、基本概念
数学上,向下取整也称为下取整或者地板函数(floor function),指得是不超过原数的最大整数。在计算机科学中,向下取整运算通常的实现是将原数减去一个余数得到不超过原数的最大整数。以Lua为例,向下取整可以使用math.floor()函数实现。
local num = 3.25 print(math.floor(num)) -- 输出3
上述代码中,num为3.25,使用math.floor(num)后得到的结果为3,即不超过3.25的最大整数。
二、应用场景
1、数值计算:在科学计算领域中,计算结果需要精确到小数点后若干位数。但是在实际计算中,往往需要将结果转换为整型数据,这时就需要使用向下取整函数,将小数转换为整数。
local num = 3.99 print(math.floor(num)) -- 输出3
2、坐标取整:在计算机图形学领域中,坐标通常是以小数形式给出的。但是在绘制图形时,需要将坐标转换为整数。这时就需要使用向下取整函数。
local x = 3.5 local y = 2.8 -- 将坐标取整 local rx = math.floor(x) local ry = math.floor(y) print(rx, ry) -- 输出3 2
3、时间戳处理:在处理时间戳时,需要将时间戳转换为日期时间格式。但是在转换时,往往需要将时间戳向下取整,以保证转换后的结果正确。
local timestamp = os.time() local day_begin_timestamp = math.floor(timestamp/(24*3600))*(24*3600) print(os.date("%Y-%m-%d %H:%M:%S", day_begin_timestamp)) -- 输出当天0点的日期时间格式
三、注意事项
1、向下取整的结果永远是小于或等于原数的最大整数。
local num = 3 print(math.floor(num)) -- 输出3
2、注意浮点数精度问题。在计算机中,浮点数的计算可能出现精度误差。在使用向下取整函数时,也需要注意这个问题。
local num = 3.000000000001 print(math.floor(num)) -- 输出3
3、向下取整函数只能用于处理数值类型的数据,对于其他类型的数据无法使用。
local str = "hello world" print(math.floor(str)) -- 报错:attempt to perform arithmetic on a string value
四、实战演练
1、计算圆的面积。输入圆的半径r,输出圆的面积S。
print("请输入圆的半径:") local r = tonumber(io.read()) local pi = 3.1415926 local s = pi * r^2 print("圆的面积为:"..math.floor(s))
2、求一个整数的二进制表示中1的个数。
print("请输入一个整数:") local n = tonumber(io.read()) local cnt = 0 while n > 0 do if n % 2 == 1 then cnt = cnt + 1 end n = math.floor(n/2) end print("该整数的二进制表示中1的个数为:"..cnt)
3、编写一个程序,求一个整数序列的中位数(假设序列长度为奇数)。
print("请输入一个整数序列,以逗号分隔:") local line = io.read() local t = {} for s in string.gmatch(line, "[^,]+") do table.insert(t, tonumber(s)) end table.sort(t) local mid = math.floor(#t/2)+1 print("该整数序列的中位数为:"..t[mid])