2014-01-07 40 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