2010-09-23 10 views
37

तो यदि मेरे पास '0 - 1024' संख्याएं हैं और मैं उन्हें '0 - 255' में लाने के लिए चाहता हूं, तो गणित अधिकतम इनपुट द्वारा इनपुट को विभाजित करने के लिए निर्देशित करेगा (इस मामले में 1024) मुझे 0.0 - 1.0 के बीच एक संख्या देगी। फिर गंतव्य सीमा से गुणा करें, (255)।एक पूर्णांक वापसी 0.0 द्वारा एक फ्लोट को विभाजित क्यों करता है?

जो मैं करना चाहता हूं!

लेकिन जावा में किसी कारण से (प्रसंस्करण का प्रयोग करके) यह हमेशा 0.

कोड का मान प्रदान करेगा इस

float scale; 
scale = (n/1024) * 255; 

के रूप में सरल किया जाएगा लेकिन मैं सिर्फ 0.0 मिलता है। मैंने डबल और int की कोशिश की है। सब कुछ फायदा नहीं हुआ। क्यूं कर!?

+2

'n' भी' float' के रूप में परिभाषित किया जाना चाहिए। –

+1

एन फ्लोट नहीं होना चाहिए, केवल संख्यात्मक। हालांकि 1024 फ्लोट/डबल होना चाहिए (1024.0) – KevinDTimm

उत्तर

68

ऐसा इसलिए है क्योंकि आप पूर्णांक विभाजन कर रहे हैं।

फूट डालो एक डबल या एक नाव से, और यह काम करेगा:

double scale = (n/1024.0) * 255 ; 

या, अगर आप यह चाहते एक नाव के रूप में,

float scale = (n/1024.0f) * 255 ; 
+1

उत्तर के लिए बहुत बहुत धन्यवाद! :) –

19

एन/1024 पूर्णांक विभाजन है, जो एक पूर्णांक उत्पन्न करता है (यानी इस मामले में 0)।

इसके बजाय n/1024.0 का उपयोग करें।

+0

+1 क्योंकि यह मेरे उत्तर से बेहतर है :) – Agos

+0

उत्तर के लिए बहुत बहुत धन्यवाद! :) –

+0

धन्यवाद! यह काम करता हैं। एन/1024.0 एफ –

2

आपको गुणा के माध्यम से फ्लोट करने के लिए स्वत: कास्ट करना चाहिए, अन्यथा आप एक पूर्णांक ऑपरेशन कर रहे हैं और फिर परिणाम को कास्टिंग कर सकते हैं, बजाय फ्लोट्स के बीच ऑपरेशन करने की बजाय।

float scale; 
scale = n * 1.0/1024 * 255; 
7

मैं n अनुमान एक int है। क्योंकि स्थिरांक 1024 और 255 दोनों int हैं, सभी दाएं हाथ की गणना पूर्णांक अंकगणितीय के साथ की जा रही हैं। n/1024 के परिणाम का अर्थ 255 द्वारा गुणा होने से पहले एक अभिन्न मूल्य को छोटा कर दिया जा रहा है।

scale = n/1024.0 * 255.0;  // Use double constants. 
scale = (double) n/1024 * 255; // Convert n to a double. 
scale = n * 255/1024;   // Multiply before dividing. 

पिछले एक अभी भी पूर्णांक गणित का उपयोग करता है, लेकिन आपरेशन के आदेश स्विचन आप आप हूँ 0 पर अवांछित काट-छांट नहीं मिलेगा मतलब है:

इन संशोधनों के किसी भी गणना सही ढंग से काम कर देगा अभी भी केवल पूर्णांक जवाब प्राप्त करें, इसलिए आप उत्तर में कोई दशमलव अंक खो देंगे।

+0

उत्तर के लिए बहुत बहुत धन्यवाद! :) –

2

आपके मामले में n/1024 परिणामस्वरूप 0 में आप पूर्णांक विभाजन कर रहे हैं। इसे दूर करने के लिए आप n से float पर जा सकते हैं। इससे आपको 0.0 और 1.0 के बीच परिणाम मिलेगा, इसके बाद आप 255 से गुणा करें और परिणाम को पूर्णांक में डालेंगे। इसके अलावा, आप घोषित करने के लिए scale रूप int

int scale; 
int n = 80; 
scale = (int)(((float)n/1024) * 255); 
2

दूसरों महान जवाब पहले से ही दे दिया है की जरूरत है।मामले में आप अपने पैमाने एक पूर्णांक (यदि आपके n एक पूर्णांक पहले से ही है जो समझ में आता है) होना चाहता हूँ, तुम कर सकते हो

int scale = ((255 * n)/1024); 

ध्यान दें कि आप जब तक इन कर रहे हैं इस के साथ कोई समस्या नहीं मारा जाएगा नंबर, के बाद से n * 255 हमेशा एक पूर्णांक में फिट होगा जब अधिकतम एन = 1024

अधिक लचीला होगा

int scale(int value, int old_max, int new_max){ 
    java.math.BigInteger big_value = java.math.BigInteger.valueOf(value); 
    java.math.BigInteger big_old_max = java.math.BigInteger.valueOf(old_max); 
    java.math.BigInteger big_new_max = java.math.BigInteger.valueOf(new_max); 
    java.math.BigInteger mult = big_value.multiply(big_old_max); 
    return (int) mult.devide(big_new_max).doubleValue(); 
} 

आप इस तरह से किसी भी ints अतिप्रवाह नहीं होगा, हालांकि मैं मानता है कि यह एक है बिट वर्बोज़

,210

संपादित करें:

मूल रूप से एक ही है, लेकिन कम भद्दा (हालांकि बहुत अधिक संख्या के लिए आप कुछ precission त्रुटियों में आ सकते हैं)

int scale(int value, int old_max, int new_max){ 
    double factor = (double) new_max/(double) old_max; 
    return factor * value; 
} 
+0

हे, यही कारण है कि मैं BigInteger और BigDecimal से नफरत करता हूं। –