Swift में Double को Round करना एक समस्या क्यों है (और 2025 में इससे कैसे निपटें)
\n\nहर iOS डेवलपर को देर-सबेर ऐसी स्थिति का सामना करना पड़ता है: उपयोगकर्ता को उत्पाद की कीमत 99.99 दिखानी है, लेकिन कोड में 99.99000000000001 है। परिचित लग रहा है? Swift में Double को Round करने की दुनिया में आपका स्वागत है - एक ऐसा विषय जिसने Stack Overflow पर हज़ारों बार देखा गया है और 2025 में भी दिमाग को उलझाए रखता है।
समस्या Swift में नहीं है - समस्या फ़्लोटिंग-पॉइंट संख्याओं (IEEE 754) की प्रकृति में है। Double 0.1 को सटीक रूप से प्रस्तुत नहीं कर सकता, जैसे दशमलव प्रणाली 1/3 को नहीं कर सकती। लेकिन उपयोगकर्ता के लिए यह कोई बहाना नहीं है। उन्हें स्क्रीन पर सुंदर अंक चाहिए।
\n\nइस लेख में, मैं Swift में Double को Round करने के 5 सिद्ध तरीके दिखाऊंगा, उनके फायदे और नुकसान पर चर्चा करूंगा, और आपके कार्य के लिए चयन का एक स्पष्ट एल्गोरिदम दूंगा। चलिए शुरू करते हैं!
\n\nविधि 1: Foundation — round() + pow(10, n) — क्लासिक तरीका
\n\nसबसे स्पष्ट तरीका जो दिमाग में आता है: संख्या को 10^n से गुणा करें, round करें, वापस विभाजित करें।
\n\nimport Foundation\n\nfunc roundDouble(_ value: Double, toPlaces places: Int) -> Double {\n let divisor = pow(10.0, Double(places))\n return round(value * divisor) / divisor\n}\n\nlet price = 99.995\nprint(roundDouble(price, toPlaces: 2)) // 100.0 (बैंकर्स राउंडिंग)\n\n\nलाभ:
\n- \n
- सरलता और पठनीयता \n
- बिना किसी अतिरिक्त आयात के काम करता है \n
नुकसान:
\n- \n
- सटीकता में त्रुटियाँ - Double के कारण 99.99 के बजाय 99.99000000000001 मिल सकता है \n
- बैंकर्स राउंडिंग की समस्या - round() round half up का उपयोग करता है, जो हमेशा वित्तीय गणनाओं के लिए उपयुक्त नहीं होता \n
- pow(10, n) - अतिरिक्त गणनाएँ \n
यह विधि UI में मोटे तौर पर राउंडिंग के लिए उपयुक्त है, लेकिन वित्तीय गणनाओं के लिए नहीं।
\n\nविधि 2: String(format:) — स्ट्रिंग के माध्यम से राउंडिंग (UI के लिए सबसे तेज़)
\n\nयदि आपका अंतिम लक्ष्य स्क्रीन पर संख्या दिखाना है, तो Double के साथ काम करने की आवश्यकता ही क्यों है? इसे सीधे स्ट्रिंग में बदलें।
\n\nlet value = 123.456789\nlet roundedString = String(format: "%.2f", value)\nprint(roundedString) // "123.46"\n\n// वापस Double में (यदि आवश्यक हो)\nlet roundedDouble = Double(roundedString) ?? 0.0\n\n\nलाभ:
\n- \n
- बिजली की गति - कोई अतिरिक्त गणितीय संक्रियाएँ नहीं \n
- आउटपुट पर गारंटीकृत सही दशमलव स्थान
- स्थानीयकरण समर्थन (दशमलव विभाजक)
नुकसान:
\n- \n
- परिणाम एक स्ट्रिंग है, आगे की गणनाओं के लिए वापस कनवर्ट करना होगा (सटीकता का नुकसान)
- बैंकर्स राउंडिंग के लिए उपयुक्त नहीं (डिफ़ॉल्ट रूप से round half up)
कीमतों, प्रतिशतों, रेटिंग्स को प्रदर्शित करने के लिए आदर्श - जहाँ भी ±0.01 की सटीकता महत्वपूर्ण नहीं है।
\n\nविधि 3: NSDecimalNumber — वित्तीय सटीकता का राजा
\n\nजब पैसा दांव पर हो, तो Double बुराई है। NSDecimalNumber का उपयोग करें - यह संख्याओं को दशमलव प्रारूप में बिना राउंडिंग त्रुटियों के संग्रहीत करता है।
import Foundation\n\nfunc roundDecimal(_ value: Double, toPlaces places: Int, roundingMode: NSDecimalNumber.RoundingMode = .plain) -> Double {\n let decimal = NSDecimalNumber(value: value)\n let handler = NSDecimalNumberHandler(\n roundingMode: roundingMode,\n scale: Int16(places),\n raiseOnExactness: false,\n raiseOnOverflow: false,\n raiseOnUnderflow: false,\n raiseOnDivideByZero: false\n )\n return decimal.rounding(accordingToBehavior: handler).doubleValue\n}\n\nlet amount = 99.995\nprint(roundDecimal(amount, toPlaces: 2, roundingMode: .bankers)) // 99.99 (बैंकर्स राउंडिंग!)\n\n\nलाभ:
\n- \n
- राउंडिंग पर पूर्ण नियंत्रण — .plain, .down, .up, .b