পিএইচপি এবং মাইএসকিএলে আর্থিক মানগুলি কীভাবে পরিচালনা করবেন?


16

আমি একটি মাইএসকিউএল ডাটাবেসের শীর্ষে পিএইচপিতে লিখিত লিগ্যাসি কোডের একটি বিশাল স্তূপ উত্তরাধিকার সূত্রে পেয়েছি। আমি যে জিনিসটি লক্ষ্য করেছি তা হ'ল অ্যাপ্লিকেশনটি doublesস্টোর এবং ডেটা ম্যানিপুলেশনের জন্য ব্যবহার করে।

doubleরাউন্ডিং ত্রুটির কারণে কীভাবে আর্থিক ক্রিয়াকলাপগুলির জন্য উপযুক্ত নয় তা উল্লেখ করে আমি এখন অসংখ্য পোস্ট জুড়ে এসেছি । তবে, পিএইচপি কোডে কীভাবে আর্থিক মানগুলি পরিচালনা করা উচিত এবং একটি মাইএসকিউএল ডাটাবেসে সংরক্ষণ করা উচিত তার সম্পূর্ণ সমাধান আমি এখনও পাইনি।

বিশেষত পিএইচপি-তে অর্থ পরিচালনার ক্ষেত্রে কী সেরা অনুশীলন রয়েছে?

আমি যে বিষয়গুলি সন্ধান করছি সেগুলি হ'ল:

  1. ডাটাবেসে ডাটা কীভাবে সংরক্ষণ করা উচিত? কলামের ধরণ? আকার?
  2. সাধারণ সংযোজন, বিয়োগফলে ডেটা কীভাবে পরিচালনা করা উচিত। গুণ বা বিভাগ?
  3. আমি কখন মানগুলি গোল করব? কতটি রাউন্ডিং যদি গ্রহণযোগ্য হয়?
  4. বড় আর্থিক মান এবং নিম্ন মানগুলি পরিচালনা করার মধ্যে কি পার্থক্য রয়েছে?

দ্রষ্টব্য: আমি কীভাবে দৈনন্দিন জীবনে অর্থের মূল্যবোধের মুখোমুখি হতে পারি তার একটি খুব সরল নমুনা কোড (সরলকরণের জন্য বিভিন্ন সুরক্ষার উদ্বেগ উপেক্ষা করা হয়েছিল real অবশ্যই বাস্তব জীবনে আমি আমার কোডটি এর আগে কখনও ব্যবহার করব না):

$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed 

$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.

$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?

আমি আশা করি আপনি এই নমুনা কোডটি আরও ব্যবহারের ক্ষেত্রে আনা এবং অবশ্যই আক্ষরিক অর্থে না নেওয়ার উপায় হিসাবে ব্যবহার করেন।

বোনাস প্রশ্ন যদি আমি কোনও ওআরএম যেমন ডক্ট্রিন বা প্রোপেল ব্যবহার করি তবে আমার কোডে অর্থ ব্যবহার করা কতটা আলাদা হবে।


1
আমি পিএইচপি জানি না তবে পরিভাষা জানা গুগল-ফুর জন্য এই পরিস্থিতিতে খুব অমূল্য, আপনি যে শব্দটির সন্ধান করছেন তা হল "স্বেচ্ছাচারিত নির্ভুলতা" যা গুগল php.net/manual/en/book.bc.php এর
জিমি হোফা

1
@ জিমি হোফা: সালিসী নির্ভুলতা সাধারণত আপনার প্রয়োজন মতো হয় না, এমন কিছু যা নির্ভুলভাবে প্রতিনিধিত্ব করতে পারে এবং দশমিক ভগ্নাংশের সাথে কাজ করতে পারে। অবশ্যই, আপনি প্রায়শই দুটি মিলিত দেখতে পান তবে উদাহরণস্বরূপ decimalসি # তে টাইপটির সীমাবদ্ধতা সীমিত থাকলেও আর্থিক মানগুলির জন্য এটি উপযুক্ত।
মাইকেল বর্গওয়ার্ট

1
@ মিশেলবার্গওয়ার্ড ঠিক আছে, আমি যুক্তিবাদী প্রকারগুলি সম্পর্কে ভুলে যাই কারণ অনেকগুলি ভাষায় সেগুলি নেই। ভাল কল.
জিমি হোফা

মুদ্রা এবং লিগ্যাসি কোডের সাথে প্রচুর পরিশ্রম করে, আমি বলব এটি ডলারের পরিবর্তে এটি পূর্ণসংখ্যায় সঞ্চয় এবং সেন্ট ব্যবহার করার জন্য যান। যদিও সাবধান থাকুন, 32 পূর্ণসংখ্যার একটি আশ্চর্যজনক পরিমাণ কম পরিমাণে 4 ধরে রাখতে পারে) 32 বিট পূর্ণসংখ্যার স্বাক্ষরবিহীন এবং সেন্ট ব্যবহার না করে কেবল 21 মিলিয়ন পরিমাণ ধরে রাখতে পারে।
পিটার বি

একদিকে যেমন, আপনার নমুনা কোড যা পোষ্ট করা মূল্য এবং ছাড় ছাড় দেখায় তা আমাকে আতঙ্কিত করে। আশা করা যায় এটি এত সহজ করা হয়েছে যে এটি বাস্তব ব্যবহারকে প্রতিফলিত করে না, তবে মুখের মূল্য হিসাবে দেখে মনে হচ্ছে আপনি কোনও ব্রাউজারকে বিশ্বাস করছেন যে কোনও আইটেমের দাম কোনও লুকানো ক্ষেত্র বা এমন কিছু পোস্ট করে পোস্ট করার মাধ্যমে আপনাকে জানান to
কারসন 63000

উত্তর:


6

পিএইচপি / মাইএসকিউএল সহ নম্বরগুলি পরিচালনা করা বেশ জটিল হতে পারে। যদি আপনি দশমিক (10,2) ব্যবহার করেন এবং আপনার সংখ্যাটি দীর্ঘ হয় বা উচ্চতর নির্ভুলতা থাকে তবে এটি ত্রুটি ছাড়াই কেটে যাবে (যদি আপনি আপনার ডিবি সার্ভারের জন্য উপযুক্ত মোড সেট না করেন)।

বড় মানগুলি বা উচ্চ নির্ভুলতার মানগুলি হ্যান্ডেল করতে আপনি বিসিমাথের মতো লাইব্রেরি ব্যবহার করতে পারেন এটি আপনাকে বৃহত সংখ্যায় প্রাথমিক ক্রিয়াকলাপ তৈরি করতে এবং প্রয়োজনীয় নির্ভুলতা রাখতে দেয়।

আপনি ঠিক কী গণনা করবেন তা আমি নিশ্চিত নই তবে আপনার মনে রাখতে হবে যে (0.22 * 0.4576) + (0.78 * 0.4576) যদি আপনি প্রক্রিয়াটির মাধ্যমে যথাযথ নির্ভুলতা ব্যবহার না করেন তবে 0.4576 এর সমান হবে না।

মাইএসকিউএল-এ DECIMAL এর সর্বাধিক আকার 65 হয় তাই এটি কোনও উদ্দেশ্যেই যথেষ্ট পরিমাণে হওয়া উচিত। আপনি যদি নির্ধারিত ক্ষেত্রের প্রকারটি ব্যবহার করেন তবে এটি কোনও ORM বা কেবল সরল PDO / mysql (i) ব্যবহার ব্যতীত স্ট্রিং হিসাবে ফিরে আসবে।

ডাটাবেসে ডাটা কীভাবে সংরক্ষণ করা উচিত? কলামের ধরণ? আকার?

আপনার প্রয়োজনীয় নির্ভুলতার সাথে সিদ্ধান্ত নিন। আপনি যদি বিনিময় হার ব্যবহার করে থাকেন তবে আপনার কমপক্ষে চার দশমিক স্থানের প্রয়োজন হবে

সাধারণ সংযোজন, বিয়োগফলে ডেটা কীভাবে পরিচালনা করা উচিত। গুণ বা বিভাগ?

বিসিমেথকে সেভ সাইডে থাকতে ব্যবহার করুন এবং কেন ভাসা ব্যবহার করা ভাল ধারণা নয়

আমি কখন মানগুলি গোল করব? কতটি রাউন্ডিং যদি গ্রহণযোগ্য হয়?

আর্থিক মানগুলির জন্য সাধারণ দুটি দশমিক স্থান গ্রহণযোগ্য তবে আপনার যদি আরও বেশি প্রয়োজন হতে পারে উদাহরণস্বরূপ আপনি যদি বিনিময় হার ব্যবহার করছেন।

বড় আর্থিক মান এবং নিম্ন মানগুলি পরিচালনা করার মধ্যে কি পার্থক্য রয়েছে?

আপনি কী বোঝাতে চেয়েছেন তার উপর নির্ভর করে। উচ্চ নির্ভুলতার সাথে হ্যান্ডলিং সংখ্যাগুলির মধ্যে অবশ্যই একটি পার্থক্য রয়েছে।


9

চারপাশে একটি সাধারণ কাজ হ'ল এগুলি পূর্ণসংখ্যা হিসাবে সংরক্ষণ করা। 99.99 9999 হিসাবে সঞ্চিত। এটি যদি কাজ না করে (এবং এটির জন্য পছন্দগুলি কেন এমন কারণ হতে পারে তার অনেকগুলি কারণ রয়েছে) আপনি দশমিক টাইপ ব্যবহার করতে পারেন। মাইএসকিএল পক্ষের http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html । পিএইচপি সাইডে আমি এই /programming/3244094/decimal-type-in-php খুঁজে পেয়েছি যা আপনার পরে কী হতে পারে।

বোনাস প্রশ্ন: বলা শক্ত। Orm বেছে নেওয়া ডেটা ধরণের ভিত্তিতে কাজ করতে চলেছে। আমি বলব যে আপনি সাহায্য করতে বিমূর্ততা সহ কিছু স্টাফ করতে পারেন তবে এই নির্দিষ্ট সমস্যাটি কেবল কোনও ওআরএম এ গিয়ে সমাধান করা যায় না।


1
এফডাব্লুআইডাব্লু, ড্রুপাল কমার্স 9999 টি কৌশল ব্যবহার করে এর দামগুলি সংরক্ষণ করে।
ফ্লোরিয়ান মার্জাইন

1
"এবং এটি একটি খারাপ পছন্দ হতে পারে তার অনেকগুলি কারণ রয়েছে" আপনি কি এই অনুশীলনে কিছু সমস্যা ভাগ করে নেবেন?
সাঙ্গো



3

আমি আমার অভিজ্ঞতা এটিতে চেষ্টা করব:

আমি যে বিষয়গুলি সন্ধান করছি সেগুলি হ'ল:

ডাটাবেসে ডাটা কীভাবে সংরক্ষণ করা উচিত? কলামের ধরণ? আকার?

আমি DECIMAL(10,2)সমস্যা ছাড়াই মাইএসকিএল-এর জন্য ব্যবহার করে যাচ্ছি (8 টি সম্পূর্ণ এবং 2 দশমিক == 99.999.999,99 == বিপুল পরিমাণে) তবে এটি আপনাকে যে অর্থের সীমাটি আবরণ করতে হবে তার উপর নির্ভর করে। অতিরিক্ত পরিমাণে অতিরিক্ত যত্ন সহকারে নেওয়া উচিত (উদাহরণস্বরূপ ওএস সর্বাধিক ভাসমান মান)। দশমিক অংশে আমি কাটা বা গোলাকার মানগুলি এড়াতে 2 টি মান ব্যবহার করি values অর্থ গ্রহণের ক্ষেত্রে কয়েকটি ক্ষেত্রে আপনার আরও দশমিকের প্রয়োজন হয় (এই ক্ষেত্রে আপনাকে নিশ্চিত হওয়া উচিত যে ব্যবহারকারী তাদের সকলের সাথে কাজ করবেন, অন্যথায় অকেজো ডাটা)

সাধারণ সংযোজন, বিয়োগফলে ডেটা কীভাবে পরিচালনা করা উচিত। গুণ বা বিভাগ?

একটি মুদ্রা এবং একটি এক্সচেঞ্জ টেবিল (তারিখ সহ) দিয়ে কাজ করুন। এইভাবে আপনি নিশ্চিত হন যে আপনার সর্বদা সঠিক পরিমাণের সঞ্চয় হবে। একটি অতিরিক্ত: সম্পূর্ণ মানগুলি সংরক্ষণ করুন এবং গণনার ফলাফলের সাথে একটি ভিউ তৈরি করুন। এটি আপনাকে ফ্লাইয়ের মান ঠিক করতে সহায়তা করবে

আমি কখন মানগুলি গোল করব? কতটি রাউন্ডিং যদি গ্রহণযোগ্য হয়?

আবার, আপনার সিস্টেমের অর্থের পরিসীমা উপর নির্ভর করে। মুদ্রা এক্সচেঞ্জের জগাখিচুড়ি পড়ার দরকার না পড়লে সর্বদা KISS পদে ভাবেন

বড় আর্থিক মান এবং নিম্ন মানগুলি পরিচালনা করার মধ্যে কি পার্থক্য রয়েছে?

আপনার ওএস এবং প্রোগ্রামিং ভাষার উপর নির্ভর করে আপনার সর্বদা আপনাকে সর্বোচ্চ এবং সর্বনিম্ন মানগুলি পরীক্ষা করতে হবে


উত্তরের জন্য ধন্যবাদ, তবে যদি আমাকে এমন কিছু হ্যান্ডেল করতে হয় $valueToBeStored= $a * $b;যদি $aএবং $bউভয়ই ডেটাবেস থেকে দশমিক হিসাবে পড়ে থাকে তবে আমার মনে হয় এগুলি doubleপিএইচপি-তে ডান হয়ে যাবে? যে সংখ্যা প্রভাবিত করবে?
সাঙ্গো

$aএবং $bডিবি থেকে নেওয়া হয়? সুতরাং, আমার উদাহরণে আপনাকে কখনও সঞ্চয় করার দরকার নেই $valueToBeStoredকারণ আপনার কাছে সর্বদা উত্স $aএবং $bডেটা থাকবে। সুতরাং আপনি কোনও ফাংশনটিতে মানটি প্রোগ্রামারমেটিক্যালি কাজ করতে পারেন বা কলামের ফলাফলের সাথে মাইএসকিএল ভিউ তৈরি করতে পারেন। এইভাবে, যদি কোনও মান পরিবর্তন করতে হয় তবে আপনাকে একাধিক স্থান সংশোধন করার বিষয়ে চিন্তা করতে হবে না (ত্রুটির প্রবণতা)
আলউইন কেসলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.