2 ints के विभाजन को एक और int के बजाय एक फ्लोट कैसे बनाते हैं?


149

एक और ब्रूस एकेल्स में वेग की गणना करने के लिए व्यायाम करते हैं, v = s / tजहां एस और टी पूर्णांक होते हैं। मैं इसे कैसे बनाऊं ताकि डिवीजन क्रैंक एक फ्लोट बाहर हो?

class CalcV {
  float v;
  float calcV(int s, int t) {
    v = s / t;
    return v;
  } //end calcV
}

public class PassObject {

  public static void main (String[] args ) {
    int distance;
    distance = 4;

    int t;
    t = 3;

    float outV;

    CalcV v = new CalcV();
    outV = v.calcV(distance, t);

    System.out.println("velocity : " + outV);
  } //end main
}//end class

फ्लोट वी = एस / टी डिवीजन करता है फिर परिणाम को फ्लोट में बदल देता है। float v = (float) s / t casts to float फिर विभाजन करता है।
जुआन कार्लोस इटुरियागोगिटिया

जवाबों:


307

बस दो ऑपरेंड में से एक को पहले एक फ्लोट के लिए कास्ट करें।

v = (float)s / t;

कलाकारों में विभाजन की तुलना में अधिक पूर्वता होती है, इसलिए विभाजन से पहले ऐसा होता है।

दूसरे ऑपरेटर को कंपाइलर द्वारा स्वचालित रूप से एक फ्लोट में डाला जाएगा क्योंकि नियमों का कहना है कि यदि ऑपरेंड या तो फ़्लोटिंग पॉइंट प्रकार का है तो ऑपरेशन एक फ़्लोटिंग पॉइंट ऑपरेशन होगा, भले ही दूसरा ऑपरेंड अभिन्न हो। जावा भाषा विनिर्देश, §4.2.4 और 715.17


8
Grrr, यह मुझे लगभग 30 मिनट तक लगा जब तक मुझे यह नहीं मिला और यह पता लगा। बहुत आसन। : डी
रिहर्सड

अधिक विशेष रूप से, इस विशेष नियम का उल्लेख यहां किया गया है: गुणक संचालक , इसलिए इसे भविष्य के संदर्भ के लिए यहां खड़े होने दें।
क्वांटम

5
(बाद में इस प्रश्न पर आने वाले किसी व्यक्ति के लिए, दिए गए लिंक टूट गए हैं। नए हैं: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 और डॉक्स। oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
स्टीव हैली

13

प्रयत्न:

v = (float)s / (float)t;

फ्लोट्स में इन्टस को कास्टिंग करने से फ्लोटिंग-पॉइंट डिवीजन को जगह मिलेगी।

आपको वास्तव में केवल एक कास्ट करने की आवश्यकता है, हालांकि।


मुझे नहीं पता, यह कहने जैसा है कि आपको आईओएफ की जगह लॉन्ग का इस्तेमाल करना चाहिए।
जैकब ज़वेर्का

4

फ्लोटिंग पॉइंट गणित के साथ किए जाने वाले ऑपरेशन को बाध्य करने के लिए एक पूर्णांक के लिए एक फ्लोटर्स कास्ट करें। अन्यथा पूर्णांक गणित हमेशा पसंद किया जाता है। इसलिए:

v = (float)s / t;


3

आप अंश या हर को तैरने के लिए रख सकते हैं ...

int ऑपरेशंस आमतौर पर int वापस आते हैं, इसलिए आपको ऑपरेंडिंग नंबरों में से एक को बदलना होगा।


1
आम तौर पर? यदि वे सभी वापस लौटते हैं, तो वे इंट वापस लौटने वाले हैं।
मैथ्यू फ्लैशेन

3

आप उनमें से सिर्फ एक को भी कास्ट कर सकते हैं, लेकिन स्थिरता के लिए आप स्पष्ट रूप से वी = (फ्लोट) एस / (फ्लोट) टी जैसे कुछ काम करना चाहते हैं।


1

JLS मानक

JLS 7 15.17.2। प्रभाग संचालक / कहते हैं:

पूर्णांक विभाजन 0. की ओर होता है। अर्थात, ऑपरेशन्स के लिए निर्मित n और d जो बाइनरी न्यूमेरिक प्रमोशन ()5.6.2) के बाद पूर्णांक होते हैं, एक पूर्णांक मान q होता है जिसका परिमाण संतोषजनक रहते हुए यथासंभव बड़ा होता है। d · q | | एन | इसके अलावा, q सकारात्मक है जब | n | | | डी | और n और d का चिन्ह एक ही है, लेकिन q ऋणात्मक है जब n | n | | | डी | और n और d में विपरीत संकेत हैं।

यही कारण है कि 1/2एक फ्लोट नहीं देता है।

केवल 15.17 में होने के(float)1/2 कारण झांकियों में तैरने के लिए या तो परिवर्तित करना गुणक संचालक कहते हैं:

बाइनरी न्यूमेरिक प्रमोशन ऑपरेंड पर किया जाता है

और 5.6.2 है। बाइनरी न्यूमेरिक प्रमोशन कहता है:

  • यदि या तो ऑपरेंड टाइप डबल का है, तो दूसरा डबल में बदल जाता है।
  • अन्यथा, यदि या तो ऑपरेंड प्रकार फ्लोट का है, तो दूसरा फ्लोट में बदल जाता है

0

फ्लोटिंग पॉइंट मैथ के साथ किए जाने वाले ऑपरेशन को बाध्य करने के लिए पूर्णांक / पूर्णांक के दोनों में से एक कास्ट करें। अन्यथा पूर्णांक गणित हमेशा पसंद किया जाता है। इसलिए:

1. v = (float)s / t;
2. v = (float)s / (float)t;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.