2017-05-12 15 views
8

मैं उलझन में हूं कि कैसे स्कैला शून्य से विभाजन को संभालता है। यहां एक आरईपीएल कोड स्निपेट है।शून्य द्वारा स्कैला डिवीजन अलग-अलग परिणाम पैदा करता है

  • :
  • :

    scala> 1/0 
    java.lang.ArithmeticException:/by zero 
        ... 33 elided 
    
    scala> 1.toDouble/0.toDouble 
    res1: Double = Infinity 
    
    scala> 0.0/0.0 
    res2: Double = NaN 
    
    scala> 0/0 
    java.lang.ArithmeticException:/by zero 
        ... 33 elided 
    
    scala> 1.toInt/0.toInt 
    java.lang.ArithmeticException:/by zero 
        ... 33 elided 
    

    आप ऊपर के उदाहरण में देख सकते हैं, कैसे आप शून्य से विभाजित के आधार पर आप निम्न में से एक मिल "java.lang.ArithmeticException/शून्य से"

  • "डबल = NaN"
  • "डबल = इन्फिनिटी"

यह काफी चुनौतीपूर्ण डिबगिंग खासकर जब से डेटा के साथ काम कर बनाता है अज्ञात विशेषताओं। इस दृष्टिकोण के पीछे तर्क, या यहां तक ​​कि एक बेहतर सवाल है, स्केल में एक एकीकृत तरीके से शून्य से विभाजन को कैसे संभालना है?

+1

मैं इस अलग डेटाटाइप्स के साथ क्या करना है लगता है:

आंशिक कार्यों कुछ इस तरह के खिलाफ अपने दोस्त है। अलग-अलग, अभी तक संबंधित, गणना करते समय, हमेशा उसी डेटाटाइप का उपयोग करने का प्रयास करें। उदाहरण: डबल, इंट, इत्यादि – Titulum

+0

आप अज्ञात विशेषताओं के डेटा से निपट रहे हैं, लेकिन स्कैला जैसी स्थिर टाइप की गई भाषा में आप अज्ञात _type_ के डेटा से निपट नहीं रहे हैं। –

+0

@AlexeyRomanov मैं समझता हूं कि आपका क्या मतलब है। हालांकि, मुझे लगता है कि ज्यादातर लोग इस बात से सहमत होंगे कि इस तरह का दृष्टिकोण कुछ गंदे बगों के साथ-साथ आपके द्वारा लिखे गए अंकगणितीय ऑपरेशन के हर टुकड़े को संभालने के लिए बहुत कठिन है। – Ahmedov

उत्तर

17

यह विभिन्न प्रकार के शून्य नियमों द्वारा विभाजन के लिए नीचे है।

0/0 (के रूप में दोनों बहस पूर्णांक शाब्दिक हैं) शून्य द्वारा एक पूर्णांक प्रभाग है, और कहा कि एक java.lang.ArithmeticException फेंकने के लिए आवश्यक है।

1.toDouble/0.toDouble शून्य एक सकारात्मक अंश वाला द्वारा एक चल बिन्दु प्रभाग है, और कहा कि +Infinity करने का मूल्यांकन करने के लिए आवश्यक है।

0.0/0.0 शून्य संख्या वाले शून्य के साथ एक फ़्लोटिंग पॉइंट डिवीजन है, और इसे +NaN का मूल्यांकन करने की आवश्यकता है।

पहला जावा और स्कैला सम्मेलन है, अन्य दो आईईईई 754 फ्लोटिंग पॉइंट के गुण हैं, जो जावा और स्कैला दोनों का उपयोग करते हैं।

2

Doubles और Floatsfloating-point मूल्यों (more here) जो के रूप में IEEE 754 मानक में परिभाषित +Infinity-Infinity और NaN के रूप में प्रतिनिधित्व किया जा सकता है।
Integersfixed numbers जो स्पष्ट रूप से अमान्य डेटा का संकेत है की किसी भी तरह से नहीं है, इस तरह वे फेंक exceptions
यह करने के लिए एकीकृत समाधान Try

Try(x/y).getOrElse(0) 

पर getOrElse विधि का उपयोग करने के मामले में हो सकता है आप पुनर्प्राप्त करना चाहते केवल ArithmeticException पर आप उपयोग कर सकते recover और get

Try(x/y).recover{ case _: ArithmeticException => 0 }.get 

recover आप कन्वर्ट करने के लिए FailureSuccess
को तुम भी Option को Try उपयोग कर सकते हैं अपवाद

Try(x/y).toOption 
+1

धन्यवाद। आपका उत्तर काफी उपयोगी है कि यह संभावित समाधानों पर विस्तारित करता है। – Ahmedov

+0

@ अहमदोव, प्रशंसा के लिए धन्यवाद। –

1

दिखा आप कुछ इस तरह के लिए आंशिक कार्यों का उपयोग कर सकते हैं बिना "कोई परिणाम" वापस जाने के लिए अनुमति देता है।उदाहरण के लिए:

object MyObject { 
    def main(args: Array[String]) { 

     println(safeDiv.isDefinedAt(1.0, 1.0)) // true 
     println(safeDiv.isDefinedAt(1.0, 0.0)) // false 
     println(safeDiv(1.0, 1.0))    // 1.0 
     println(safeDiv(1.0, 0.0))    // crash 

    } 

    def safeDiv: PartialFunction[(Double, Double), Double] = { 
     case(a,b) if b != 0.0 => a/b 

    } 
} 

आंशिक कार्यों आप की जाँच करने के समारोह किसी दिए गए इनपुट के लिए परिभाषित किया गया है कि क्या अनुमति देते हैं। ऊपर दिए गए उदाहरण में, मैंने कहा कि safeDiv फ़ंक्शन परिभाषित नहीं किया गया है यदि divisor 0.0 है। इसलिए आप जांच सकते हैं कि फ़ंक्शन इनपुट को निष्पादित करेगा या नहीं। चेक आवश्यक नहीं है, हालांकि safeDiv(1.0, 0.0) निष्पादित नहीं होगा।

scala> (1.0/0.0).toInt 
res22: Int = 2147483647 
+0

ग्रेट। मुझे लगता है कि यह आसान हो जाएगा – Ahmedov

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