2013-12-12 21 views
9

Ben Redis 2.8 içinde bir Sıralı Set (http://redis.io/commands/#sorted_set) bir medyan hesaplamak için basit bir Lua komut dosyası yazıyorum. Komut dosyası, bir yüzdürme olması gerektiğinde, her zaman bir tamsayı döndürür. Sorun, komutun her zaman bir sayı döndürdüğü zaman bir tamsayı döndürmesidir. Sorun; Sonuç yanlış.Nasıl bir Lua dizesi float dönüştürmek için

$ 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 

doğru sonucu (3.1 + 3,4975) olmalıdır /2.0 == documentation for EVAL kaynaktan 3,298

cevap

9

:

Lua tek bir sayısal türü, Lua numaraları vardır. Tamsayılar ve yüzenler arasında bir ayrım yoktur. Bu yüzden, Lua sayılarını, varsa sayıların ondalık bölümünü kaldırarak, tamsayı cevaplarına dönüştürürüz. Lua'dan bir şamandıra dönmek isterseniz, tam olarak Redis'in yaptığı gibi (örneğin, ZSCORE komutuna bakın) bir dizi dizesi olarak döndürmeniz gerekir. Eğer float as a string dönüyor böylece

nedenle, komut güncellemeniz gerekmektedir:

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

Teşekkür! “Yani her zaman Lua sayılarını tamsayı cevaplarına çeviririz, sayıların ondalık kısmını çıkarırız” - Bunun için herhangi bir sebep var mı, tamamen sezgisel geliyor. – Adil

+0

Sanırım tamsayılar, redis'teki yüzenlerden daha yaygın kullanım durumudur. – Azmisov