2013-08-19 8 views
12

एक संख्या को गोल करने के लिए सबसे अच्छा तरीका है और फिर इसे छोटा कर दें (गोल करने के बाद दशमलव स्थान हटाएं)?लुआ: गोल संख्याएं और फिर

उदाहरण के लिए यदि दशमलव 0.5 से ऊपर है (यानी, 0.6, 0.7, और इसी तरह), तो मैं गोल करना चाहता हूं और फिर छोटा करना चाहता हूं (केस 1)। अन्यथा, मैं (मामले 2) काटना चाहते हैं

for example: 
232.98266601563 => after rounding and truncate = 233 (case 1) 
232.49445450000 => after rounding and truncate = 232 (case 2) 
232.50000000000 => after rounding and truncate = 232 (case 2) 

उत्तर

15

कोई निर्माण में गणित.गोल() लुआ में समारोह नहीं है, लेकिन आप निम्न कर सकते हैं: print(math.floor(a+0.5))

3

होना चाहिए math.ceil(a-0.5) सही ढंग से आधा पूर्णांक संख्या को संभालने के लिए

+1

"सही" अर्थों पर निर्भर करता है। किसी को सावधानीपूर्वक निर्णय लेना है कि आधा कदम क्या करना है, और नकारात्मक मूल्यों के साथ क्या करना है। दोनों आधा और 'मंजिल' जोड़ते हैं और आपका आधा हिस्सा घटाता है और 'छत' सटीक आधे के मामले में लगातार पूर्वाग्रह पेश करता है। और दोनों आधा और छिड़काव जोड़ने से अलग हैं मानते हैं कि छंटनी आमतौर पर शून्य की ओर घूमती है। कुछ मूल्यों में भी मूल्य को कार्यान्वित करना अधिक "निष्पक्ष" है। गोलाकार subtlety से भरा हुआ है। – RBerteig

10

एक चाल है कि पूरे पूर्णांक के अलावा अन्य दशमलव अंक पर गोलाई के लिए उपयोगी है स्वरूपित ASCII पाठ के माध्यम से मूल्य गुजरती हैं, और निर्दिष्ट करने के लिए %f प्रारूप स्ट्रिंग का उपयोग करने के लिए है गोल गोल वांछित। उदाहरण के लिए

mils = tonumber(string.format("%.3f", exact)) 

0,001 की एक बहु के लिए exact में मनमाने ढंग से मूल्य दौर होगा।

math.floor() या math.ceil() में से किसी एक का उपयोग करने से पहले और बाद में स्केलिंग के साथ एक समान परिणाम हो सकता है, लेकिन किनारे के मामलों के उपचार के आसपास आपकी अपेक्षाओं के अनुसार विवरण प्राप्त करना मुश्किल हो सकता है। यह नहीं कि string.format() के साथ यह कोई समस्या नहीं है, लेकिन इसे "अपेक्षित" परिणाम बनाने में बहुत सारे काम चल गए हैं।

दस की शक्ति के अलावा किसी अन्य चीज के लिए गोल करने के लिए अभी भी स्केलिंग की आवश्यकता होगी, और अभी भी सभी मुश्किल किनारे के मामले हैं। एक दृष्टिकोण है कि व्यक्त करने के लिए आसान है और स्थिर व्यवहार है

function round(exact, quantum) 
    local quant,frac = math.modf(exact/quantum) 
    return quantum * (quant + (frac > 0.5 and 1 or 0)) 
end 

लिखने और frac (और संभवतः exact के हस्ताक्षर) पर सटीक हालत tweak बढ़त मामलों आप चाहते थे प्राप्त करने के लिए है।

6

भी ऋणात्मक संख्याओं का समर्थन करने के लिए, इस का उपयोग करें:

function round(x) 
    return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5) 
end 
0

बुरा राउंडिंग के लिए (अंत काट):

function round(number) 
     return number - (number % 1) 
    end 

ठीक है, अगर आप चाहते हैं, आप अच्छी राउंडिंग के लिए इस विस्तार कर सकते हैं ।

function round(number) 
     if (number - (number % 0.1)) - (number - (number % 1)) < 0.5 then 
     number = number - (number % 1) 
     else 
     number = (number - (number % 1)) + 1 
     end 
    return number 
    end 

print(round(3.1)) 
print(round(math.pi)) 
print(round(42)) 
print(round(4.5)) 
print(round(4.6)) 

अपेक्षित परिणाम:

3, 3, 42, 5, 5.

मेरे लिए काम किया: डी

2

यहाँ अंकों की एक मनमाना संख्या के दौर (0 यदि करने के लिए एक है परिभाषित नहीं किया गया):

function round(x, n) 
    n = math.pow(10, n or 0) 
    x = x * n 
    if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end 
    return x/n 
end