جاوا اسکرپٹ کی حکمت عملی لکھتے وقت ، اسکرپٹنگ زبان کے خود کے کچھ مسائل کی وجہ سے ، اس سے اکثر حساب کتاب میں عددی درستگی کے مسائل پیدا ہوتے ہیں۔ اس کا پروگرام میں کچھ حساب کتاب اور منطقی فیصلوں پر کچھ اثر پڑتا ہے۔ مثال کے طور پر ، حساب کتاب کرتے وقت1 - 0.8
یا0.33 * 1.1
، غلطی کے اعداد و شمار کا حساب لگایا جائے گا:
function main() {
var a = 1 - 0.8
Log(a)
var c = 0.33 * 1.1
Log(c)
}
تو ایسے مسائل کو کیسے حل کیا جائے؟ مسئلہ کی جڑ یہ ہے:
فلوٹنگ پوائنٹ ویلیوز کی زیادہ سے زیادہ پیشرفت 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)
}
اصول یہ ہے کہ درستگی کے مسائل سے بچنے کے لئے حساب کرنے کے لئے دو آپریڈوں کو عددی اعداد میں تبدیل کیا جائے۔ حساب کتاب کے بعد (عددی اعداد میں تبدیل ہونے پر بڑھانے کے مطابق) ، درست نتائج حاصل کرنے کے لئے حساب کتاب کے نتائج کو بحال کیا جاتا ہے۔
اس طرح، جب ہم چاہتے ہیں کہ پروگرام کو ایک حکم رکھنے کے لئے جب مارکیٹ کی قیمت کے علاوہ ایک کم از کم قیمت کی درستگی، ہم عددی درستگی کے بارے میں فکر کرنے کی ضرورت نہیں ہے
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])
}
دلچسپی رکھنے والے تاجر کوڈ پڑھ سکتے ہیں، حساب کتاب کے عمل کو سمجھ سکتے ہیں، سوالات پوچھنے کے لئے خوش آمدید، ایک ساتھ سیکھیں اور ایک ساتھ ترقی کریں.