جاوا اسٹریٹجی ڈیزائن میں عددی حساب کی درستگی کا مسئلہ حل

مصنف:نیکی, تخلیق: 2020-07-09 11:31:01, تازہ کاری: 2023-10-28 15:32:47

img

جاوا اسکرپٹ کی حکمت عملی لکھتے وقت ، اسکرپٹنگ زبان کے خود کے کچھ مسائل کی وجہ سے ، اس سے اکثر حساب کتاب میں عددی درستگی کے مسائل پیدا ہوتے ہیں۔ اس کا پروگرام میں کچھ حساب کتاب اور منطقی فیصلوں پر کچھ اثر پڑتا ہے۔ مثال کے طور پر ، حساب کتاب کرتے وقت1 - 0.8یا0.33 * 1.1، غلطی کے اعداد و شمار کا حساب لگایا جائے گا:

function main() {
    var a = 1 - 0.8
    Log(a)
   
    var c = 0.33 * 1.1
    Log(c) 
}

img

تو ایسے مسائل کو کیسے حل کیا جائے؟ مسئلہ کی جڑ یہ ہے:

فلوٹنگ پوائنٹ ویلیوز کی زیادہ سے زیادہ پیشرفت 17 اعشاریہ مقامات پر ہے ، لیکن کارروائیوں کو انجام دیتے وقت درستگی عددی اعداد سے کہیں زیادہ خراب ہوتی ہے۔ آپریشن کرتے وقت عددی اعداد کو اعشاریہ میں تبدیل کیا جاتا ہے۔ اور جب جاوا اور جاوا اسکرپٹ میں اعشاریہ کارروائیوں کا حساب لگایا جاتا ہے تو ، دونوں پہلے اعشاریہ اعشاریہ کو اسی بائنری میں تبدیل کرتے ہیں ، اعشاریہ کا ایک حصہ مکمل طور پر بائنری میں تبدیل نہیں کیا جاسکتا ہے ، یہ پہلی غلطی ہے۔ اعشاریہ کو بائنری میں تبدیل کرنے کے بعد ، پھر بائنری کے درمیان آپریشن بائنری نتیجہ حاصل کرنے کے لئے انجام دیا جاتا ہے۔ پھر بائنری نتیجہ کو اعشاریہ میں تبدیل کریں ، جہاں عام طور پر دوسری غلطی ہوتی ہے۔

اس مسئلے کو حل کرنے کے لیے، میں نے انٹرنیٹ پر کچھ حل تلاش کیے، اور اس مسئلے کو حل کرنے کے لیے مندرجہ ذیل حل آزمائے اور استعمال کیے:

function mathService() {
    // addition
    this.add = function(a, b) {
        var c, d, e;
        try {
            c = a.toString().split(".")[1].length;   // Get the decimal length of a
        } catch (f) {
            c = 0;
        }
        try {
            d = b.toString().split(".")[1].length;   // Get the decimal length of b
        } catch (f) {
            d = 0;
        }
        //Find e first, multiply both a and b by e to convert to integer addition, then divide by e to restore
        return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) + this.mul(b, e)) / e;
    }
    
    // multiplication
    this.mul = function(a, b) {       
        var c = 0,
            d = a.toString(),         // Convert to string 
            e = b.toString();         // ...
        try {
            c += d.split(".")[1].length;      // c Accumulate the fractional digit length of a
        } catch (f) {}
        try {
            c += e.split(".")[1].length;      // c Accumulate the length of decimal places of b
        } catch (f) {}
        // Convert to integer multiplication, then divide by 10^c, move decimal point, restore, use integer multiplication without losing accuracy
        return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
    }

    // Subtraction
    this.sub = function(a, b) {
        var c, d, e;
        try {
            c = a.toString().split(".")[1].length;  // Get the decimal length of a
        } catch (f) {
            c = 0;
        }
        try {
            d = b.toString().split(".")[1].length;  // Get the decimal length of b
        } catch (f) {
            d = 0;
        }
        // Same as addition
        return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) - this.mul(b, e)) / e;
    }

    // Division
    this.div = function(a, b) {
        var c, d, e = 0,
            f = 0;
        try {
            e = a.toString().split(".")[1].length;
        } catch (g) {}
        try {
            f = b.toString().split(".")[1].length;
        } catch (g) {}
        // Similarly, convert to integer, after operation, restore
        return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), this.mul(c / d, Math.pow(10, f - e));
    }
}

function main() {
    var obj = new mathService()
    
    var a = 1 - 0.8
    Log(a)
    
    var b = obj.sub(1, 0.8)
    Log(b)
    
    var c = 0.33 * 1.1
    Log(c)
    
    var d = obj.mul(0.33, 1.1)
    Log(d)
}

img

اصول یہ ہے کہ درستگی کے مسائل سے بچنے کے لئے حساب کرنے کے لئے دو آپریڈوں کو عددی اعداد میں تبدیل کیا جائے۔ حساب کتاب کے بعد (عددی اعداد میں تبدیل ہونے پر بڑھانے کے مطابق) ، درست نتائج حاصل کرنے کے لئے حساب کتاب کے نتائج کو بحال کیا جاتا ہے۔

اس طرح، جب ہم چاہتے ہیں کہ پروگرام کو ایک حکم رکھنے کے لئے جب مارکیٹ کی قیمت کے علاوہ ایک کم از کم قیمت کی درستگی، ہم عددی درستگی کے بارے میں فکر کرنے کی ضرورت نہیں ہے

function mathService() {
....    // Omitted
}

function main() {
    var obj = new mathService()
    var depth = exchange.GetDepth()
    exchange.Sell(obj.add(depth.Bids[0].Price, 0.0001), depth.Bids[0].Amount, "Buy 1 order:", depth.Bids[0]) 
}

دلچسپی رکھنے والے تاجر کوڈ پڑھ سکتے ہیں، حساب کتاب کے عمل کو سمجھ سکتے ہیں، سوالات پوچھنے کے لئے خوش آمدید، ایک ساتھ سیکھیں اور ایک ساتھ ترقی کریں.


متعلقہ

مزید