मुझे लगता है कि कारण प्रकार रूपांतरण है। Abs()
फ़ंक्शन real
परिणाम देता है, इसलिए currency
परिवर्तनीय real
पर रहता है। प्रलेखन पर एक नज़र डालें:
मुद्रा एक निश्चित बिंदु डेटा प्रकार है जो मौद्रिक गणना में गोल करने वाली त्रुटियों को कम करता है। Win32 प्लेटफ़ॉर्म पर, यह दशमलव स्थान का प्रतिनिधित्व करने वाले चार अंतिम महत्वपूर्ण अंकों के साथ के साथ स्केल किए गए 64-बिट पूर्णांक के रूप में संग्रहीत किया जाता है। जब कार्य और भाव में अन्य वास्तविक प्रकार के साथ मिश्रित, मुद्रा का मूल्य स्वचालित रूप से विभाजित हैं या द्वारा 10000.
गुणा इसलिए मुद्रा ठीक हो गई है और वास्तविक फ्लोटिंग प्वाइंट है। अपने प्रश्न के लिए नमूना कोड है:
program Project3;
{$APPTYPE CONSOLE}
const VALUE = 0.09;
var a,b : currency;
begin
a := VALUE;
b := VALUE;
if a = Abs(b) then writeln('equal')
else writeln('not equal', a - Abs(b));
readln;
end.
क्योंकि प्रकार रूपांतरण के उत्पादन बराबर नहीं परिणाम;
संकलक घड़ी x : real
जोड़ना चाहते हैं तो फोन x := abs(b);
, x
जोड़ने देखता सूची में, इसे चुनें और Edit watch
दबाएं, फिर अस्थायी बिंदु का चयन पेट (vtemp1) और vtemp2
कोशिश के लिए एक ही मूल्य का पता चलता है । X
0.899...967
बन जाता है।
न केवल 0.09
मूल्य इस तरह के परिणाम उत्पन्न करता है। आप इस कोड को जांचने के लिए कोशिश कर सकते हैं:
for i := 0 to 10000 do begin
a := a + 0.001;
b := a;
if a <> abs(b) then writeln('not equal', a);
end;
इसलिए, यदि आपको मुद्रा चर के पूर्ण मूल्य की आवश्यकता है - बस इसे करें। फ्लोटिंग-पॉइंट abs()
का उपयोग न करें:
function Abs(x : Currency):Currency; inline;
begin
if x > 0 then result := x
else result := -x;
end;
पुन: पेश नहीं कर सकते – kludg
([कैसे खतरनाक यह चल बिन्दु मूल्यों की तुलना के लिए? है] http://stackoverflow.com/questions/10334688/how-dangerous-is-it-to-compare-floating-point -वृत्त) – valex
'गणित' या इसी तरह से 'समान वैल्यू' का प्रयोग करें। –