2013-12-12 5 views
9

मैं Redis 2.8 के भीतर सॉर्ट किए गए सेट (http://redis.io/commands/#sorted_set) से औसत की गणना करने के लिए एक साधारण लुआ स्क्रिप्ट लिख रहा हूं। स्क्रिप्टएक लूआ स्ट्रिंग को फ्लोट करने के लिए

नीचे
local cnt = redis.call("ZCARD", KEYS[1]) 

if cnt > 0 then 
     if cnt%2 > 0 then 
       local mid = math.floor(cnt/2) 
       return redis.call("ZRANGE", KEYS[1], mid, mid) 
     else 
       local mid = math.floor(cnt/2) 
       local vals = redis.call("ZRANGE", KEYS[1], mid-1, mid) 
       return (tonumber(vals[1]) + tonumber(vals[2]))/2.0 
     end 
else 
     return nil 
end 

समस्या, स्क्रिप्ट हमेशा एक पूर्णांक देता है जब परिणाम एक नाव होना चाहिए। परिणाम गलत है।

$ redis-cli zrange floats 0 100 
1) "1.1" 
2) "2.1" 
3) "3.1" 
4) "3.4975" 
5) "42.63" 
6) "4.1" 

$ redis-cli EVAL "$(cat median.lua)" 1 floats 
(integer) 3 

सही परिणाम होना चाहिए (3,1 + 3,4975) /2.0 == 3,298

उत्तर

9

documentation for EVAL से:

लुआ एक एकल संख्यात्मक प्रकार, लुआ संख्या है। पूर्णांक और फ्लोट के बीच कोई भेद नहीं है। इसलिए हम हमेशा लूआ संख्याओं को पूर्णांक उत्तरों में परिवर्तित करते हैं, यदि किसी भी संख्या के दशमलव भाग को हटाते हैं। यदि आप लुआ से एक फ्लोट वापस करना चाहते हैं तो आपको इसे स्ट्रिंग के रूप में वापस करना चाहिए, ठीक उसी तरह रेडिस स्वयं करता है (उदाहरण के लिए जेएससीओआर कमांड देखें)।

इसलिए, आप अपनी स्क्रिप्ट ताकि आप float as a string लौट रहे हैं अद्यतन करना चाहिए:

return tostring((tonumber(vals[1]) + tonumber(vals[2]))/2.0) 
+0

धन्यवाद! "तो हम हमेशा लूआ संख्याओं को पूर्णांक उत्तरों में परिवर्तित करते हैं, संख्या के दशमलव भाग को हटाते हैं" - क्या इसके लिए कोई कारण है, पूरी तरह से सहज ज्ञान युक्त लगता है। – Adil

+0

मुझे लगता है कि पूर्णांक लाल रंग में फ्लोट्स की तुलना में अधिक आम उपयोग केस हैं। – Azmisov

संबंधित मुद्दे