2016-08-23 6 views
7

जावा BigDecimal पार्सिंग के लिए मैं किस डेटा प्रकार का उपयोग कर सकता हूं? उद्देश्य में - सी NSDecimalNumber का उपयोग करके किया जा सकता है। क्या मेरे पास स्विफ्ट-मूल समाधान है (NSDecimalNumber का उपयोग किए बिना)?स्विफ्ट में जावा बिगडेसिमल

+3

बस 'NSDecimalNumber' का उपयोग करें। यह स्विफ्ट से ठीक काम करता है। – Rob

+0

आप समझ में नहीं आते हैं। मैं स्विफ्ट समाधान के लिए मूल चाहता हूं (बेशक, यदि मौजूद है)। – SerjOxo

+0

मुझे समझ में आता है। एक "मूल" समाधान मौजूद नहीं है। लेकिन 'NSDecimalNumber' ठीक काम करता है। और यदि आप चाहते हैं, तो आप ऑपरेटरों को परिभाषित कर सकते हैं जो इसे देशी समाधान की तरह व्यवहार करते हैं ताकि ऑपरेटरों जैसे '+', '-', आदि काम कर सकें। – Rob

उत्तर

7

यह हो सकता है कि आप क्या चाहते हैं, जैसा कि आप स्विफ्ट-मूल समाधान कह रहे हैं। लेकिन स्विफ्ट 3 में, एक पुराने सी-स्ट्रक्चर आधारित NSDecimal को Decimal के रूप में आयात किया गया है, और इसके लिए एक बड़ी पुन: व्यवस्था "यह लगभग स्विफ्ट-मूल" कहने के लिए किया गया है।

let deca = 1.23 as Decimal //<- This actually may produce some conversion error, while `ExpressibleByFloatLiteral` uses `Double` as an intermediate value. 
let decb = 0.01 as Decimal 
print(deca + decb == 1.24) //->true 

अद्यतन जोड़ा गया एक सरल उदाहरण है, जहां आप डबल में एक गणना त्रुटि (बाइनरी चल अंक प्रणाली) मिल सकता है। (एक्सकोड 8 बीटा में परीक्षण 6.)

let dblc = 0.000001 
let dbld = 100 as Double 
let dble = 0.0001 
print(dblc * dbld == dble) //->false (as Double cannot represent decimal fractions precisely) 

let decc = Decimal(string: "0.000001")! //<- avoiding conversion error 
let decd = 100 as Decimal //<- integer literal may not generate conversion error 
let dece = Decimal(string: "0.0001")! 
print(decc * decd == dece) //->true 
संबंधित मुद्दे