舍入到最接近的奇数位

时间:2014-01-07 22:25:30

标签: math lua

我想将一些数字舍入到最近的十分之一,仅使用奇数十分之一。 e.g。

91.15 -> 91.1
91.21 -> 91.3

这样做的简单通用方程是什么?

2 个答案:

答案 0 :(得分:8)

这不是四舍五入到最接近的十分之一,而是四舍五入到最接近的五分之一(二十分之一),偏移十分之一。考虑到这一点,一般等式是:

# Any language where 'round' rounds to the nearest integer
radioStation = round( (original-offset)/interval ) * interval + offset

在Lua:

-- number:   the original value to round
-- interval: the distance between desired values
-- offset:   an optional shifting of the values
function roundToNearest( number, interval, offset )
  offset   = offset   or 0  -- default value
  interval = interval or 1  -- default value
  return math.floor( (number-offset)/interval + 0.5 ) * interval + offset
end

for n=1, 2, 0.09 do
  local result = roundToNearest(n, 0.2, 0.1)
  print(string.format("%.2f : %g", n, result))
end
--> 1.00 : 1.1
--> 1.09 : 1.1
--> 1.18 : 1.1
--> 1.27 : 1.3
--> 1.36 : 1.3
--> 1.45 : 1.5
--> 1.54 : 1.5
--> 1.63 : 1.7
--> 1.72 : 1.7
--> 1.81 : 1.9
--> 1.90 : 1.9
--> 1.99 : 1.9

答案 1 :(得分:4)

怎么样

function roundToOdd(number)
    temp = math.floor(number * 10 + 0.5)
    if temp % 2 == 0 then
        -- first decimal is even, need to decide whether to "round" up or down 
        if number > temp/10 then
            -- closer to the next odd digit "up"
            temp = temp + 1
        else
            -- closer to the next odd digit "down"
            temp = temp - 1
        end
    end
    return temp/10
end

for n=1, 2, 0.09 do
  local result = roundToOdd(n, 0.2, 0.1)
  print(string.format("%.2f : %g", n, result))
end 
print(91.15,roundToOdd(91.15)) 
print(91.21,roundToOdd(91.21)) 

结果:

1.00 : 0.9
1.09 : 1.1
1.18 : 1.1
1.27 : 1.3
1.36 : 1.3
1.45 : 1.5
1.54 : 1.5
1.63 : 1.7
1.72 : 1.7
1.81 : 1.9
1.90 : 1.9
1.99 : 1.9
91.15   91.1
91.21   91.3