জাভাস্ক্রিপ্ট কৌশলগুলি লেখার সময়, স্ক্রিপ্টিং ভাষার কিছু সমস্যার কারণে, এটি প্রায়শই গণনার ক্ষেত্রে সংখ্যাসূচক নির্ভুলতার সমস্যার দিকে পরিচালিত করে। এটি প্রোগ্রামের কিছু গণনা এবং যৌক্তিক বিচারের উপর একটি নির্দিষ্ট প্রভাব ফেলে। উদাহরণস্বরূপ, যখন গণনা করা হয়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])
}
আগ্রহী ব্যবসায়ীরা কোডটি পড়তে পারেন, গণনা প্রক্রিয়াটি বুঝতে পারেন, প্রশ্ন জিজ্ঞাসা করতে পারেন, একসাথে শিখতে পারেন এবং একসাথে অগ্রগতি করতে পারেন।