2016-03-19 7 views
5

मुझे "असली" प्रकार के दो चर की तुलना में समस्या है। एक डेटासेट में संग्रहीत गणितीय ऑपरेशन का परिणाम है, दूसरा एक फॉर्म में एक संपादन फ़ील्ड का मान है, जिसे स्ट्रेटोफ्लैट द्वारा परिवर्तित किया जाता है और "रियल" चर में संग्रहीत किया जाता है। समस्या यह है: 121,97 not equal to 121,97डेल्फी - दो "वास्तविक" संख्या चर की तुलना

आप देख सकते हैं, इस कार्यक्रम मुझे बताने की, कि 121,97 121,97 के बराबर नहीं है कोशिश कर रहा है ... मैं this topic पढ़ा है, और मैं copletely यकीन नहीं है , यह एक ही समस्या है। यदि यह था, तो वैरिएबल में एक ही निकटतम प्रतिनिधित्व योग्य संख्या के रूप में संग्रहीत संख्या दोनों नहीं होगी, जो 121.97 के लिए 121.96999 99999 99998 86313 16227 83839 70260 62011 71875 है?

अब मान लें कि वे एक ही निकटतम प्रतिनिधित्व योग्य संख्या के रूप में संग्रहीत नहीं हैं। मुझे कैसे पता चलेगा कि वे वास्तव में कैसे संग्रहीत हैं? जब मैं "सीपीयू" डीबगिंग विंडो में देखता हूं, तो मैं पूरी तरह से खो जाता हूं। मैं एड्रेस देखता हूं, जहां ये मान होना चाहिए, लेकिन कुछ बाइनरी, हेक्साडेसिमल या वास्तविक संख्या का जो कुछ भी प्रस्तुत नहीं है ... मैं मानता हूं कि उन्नत डिबगिंग मेरे लिए अज्ञात ब्रह्मांड है ...

संपादित करें: उन दो मान वास्तव में थोड़ा अलग हैं।

enter image description here

ठीक है, मैं सब कुछ समझने की जरूरत नहीं है। हालांकि मैं पैसे के साथ काम नहीं कर रहा हूँ, वहाँ अधिकतम 3 दशमलव स्थानों होंगे, इसलिए "मुद्रा" बाहर रास्ता

BTW है: गणना है:

DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat; 

इस मामले में यह है 3695-3573.03

+0

जेरा आरएसपी-13792 देखें। आप 'तुलनात्मक' फ़ंक्शन का आह्वान करना चाह सकते हैं। – Magoo

+2

@ मगू यह रिपोर्ट फर्जी है। संकलक सही ढंग से व्यवहार करता है। –

+1

'StrToFloat' जैसा व्यवहार आप व्यवहार करना चाहिए।लेकिन दूसरे मूल्य के बारे में क्या? इसकी गणना कैसे की जाती है। मुझे लगता है कि आपको वास्तविक समस्या पर ध्यान देना चाहिए, जिसे हम नहीं देख सकते हैं। –

उत्तर

9

अज्ञात कारणों से, आप घड़ी सूची में हेक्साडेसिमल के रूप में एक फ्लोट वैल्यू (सिंगल/डबल या रीयल 48) नहीं देख सकते हैं।

हालांकि, आप अभी भी मेमोरी डंप के रूप में इसे देखकर हेक्साडेसिमल प्रतिनिधित्व देख सकते हैं।
यहां बताया गया है: चर सूची में चर जोड़ें। के रूप में memory dump

enter image description here

> संपादित घड़ी ...
देखें यह अब आप डीबगर में दो मानों की तुलना कर सकते हैं -
सही घड़ी पर क्लिक करें।

कभी अनिवार्य राशियों
आप निश्चित है कि आप तैरता उपयोग नहीं करना चाहिए पैसे की गिनती करने के बारे में पता है के लिए तैरता का उपयोग करें।
आप गोल करने और तुलना के साथ सभी प्रकार की परेशानी में आ जाएंगे, जिस तरह से आप उन्हें भी चाहते हैं।
यदि आप पैसे के साथ काम करना चाहते हैं तो currency इसके बजाय टाइप करें। इसमें कोई समस्या नहीं है, 4 दशमलव स्थानों का समर्थन करता है और = ऑपरेटर का उपयोग करके गोल करने वाले मुद्दों के साथ तुलना की जा सकती है।

अपने डेटाबेस में आप money या currency डेटाटाइप का उपयोग करते हैं।

+0

आप कई परिस्थितियों में समानता के लिए फ्लोट की तुलना कर सकते हैं –

+0

हां, लेकिन जब आप पैसे के साथ काम नहीं कर रहे हैं। उत्तर अपडेट किया गया। जब तक आप बिल्कुल नहीं जानते कि आप क्या कर रहे हैं फ्लोट के साथ समानता तुलना आपदा के लिए एक नुस्खा है – Johan

+0

धन्यवाद! क्या मेमोरी डंप में मैं क्या देख रहा हूं संक्षेप में वर्णन करना संभव होगा? मुझे यह कहने में खेद है, लेकिन मैं समझने में सफल नहीं रहा हूं ... मेरा मतलब है - 121.97 का हेक्साडेसिमल प्रतिनिधित्व 0x42f3f0a4 है ... –

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