2014-01-07 37 views
4

我想将一些数字舍入到最接近的十分之一,仅使用十分之十。例如四舍五入到最接近的奇数

91.15 -> 91.1 
91.21 -> 91.3 

什么是这样做的简单和通用的等式?

+1

为什么需要这个? – lhf

+1

@lhf我有一个通用脚本,从模型中获取数据并将其格式化为屏幕。在这种情况下,我模仿调频广播电台,这在美国相隔200kHz,并且如上所示,总是“奇怪”。 – Phrogz

回答

6

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

# 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 
+0

惯用的方式是'offset = offset或0'。 – lhf

+0

在对'roundToNearest'的调用中,它是'n',而不是'i'。 – lhf

+0

@lhf Bah,谢谢。在编辑框中傻傻的重构。感谢Lua的成语;我对JS和Lua的成语感到困惑。 – Phrogz

3

如何

function roundToOdd(number) 
    temp = round(number * 10) 
    if number % 2 == 0 then 
     if number > temp then 
      temp = temp + 1 
     else 
      temp = temp - 1 
     end 
    end 
    return temp/10 
end 

结果:

1.10 -> 11.0 -> 11 -> 1.1 
1.11 -> 11.1 -> 11 -> 1.1 
1.19 -> 11.9 -> 12 -> even -> 11 -> 1.1 
1.20 -> 12.0 -> 12 -> even -> 11 -> 1.1 
1.21 -> 12.1 -> 12 -> even -> 13 -> 1.3 
1.29 -> 12.9 -> 13 -> 1.3 
1.36 -> 13.6 -> 14 -> even -> 13 -> 1.3 
1.40 -> 14.0 -> 14 -> even -> 13 -> 1.3 
1.41 -> 14.1 -> 14 -> even -> 15 -> 1.5