আপনার কি এসকিউএল সার্ভারে অর্থ বা ডেসিমাল (x, y) ডেটাটাইপ নির্বাচন করা উচিত?


442

আমি moneyডেটাটাইপ এবং এর মতো কিছু decimal(19,4)(যা অর্থ অভ্যন্তরীণভাবে ব্যবহার করে, আমি বিশ্বাস করি) এর মধ্যে সত্যিকারের পার্থক্য আছে কিনা তা নিয়ে আমি আগ্রহী ।

আমি সচেতন যে moneyএসকিউএল সার্ভারের সাথে নির্দিষ্ট। আমি জানতে চাই যে অন্যগুলির মধ্যে একটি বেছে নেওয়ার কোনও বাধ্যতামূলক কারণ আছে কি না; বেশিরভাগ এসকিউএল সার্ভারের নমুনাগুলি (যেমন অ্যাডভেঞ্চার ওয়ার্কস ডাটাবেস) দামের তথ্যের মতো জিনিসগুলির জন্য ব্যবহার করে moneyনা decimal

আমি কি কেবল অর্থ উপায়ে ডেটাটাইপ ব্যবহার চালিয়ে যেতে পারি, বা এর পরিবর্তে দশমিক ব্যবহারের কোনও সুবিধা আছে? টাকা টাইপ করার জন্য কম অক্ষর, তবে এটি একটি বৈধ কারণ নয় :)


12
DECIMAL(19, 4) একটি জনপ্রিয় পছন্দ পরীক্ষা এই এছাড়াও পরীক্ষা এখানে পৃথিবী মুদ্রা বিন্যাস ব্যবহার কতগুলি দশমিক স্থান সিদ্ধান্ত নিতে, আশা করতে সাহায্য করে।
shaijut

আমি ভাবলাম কেন টাকার ডেটা টাইপের 4 দশমিক 2 থাকে .. এবং 2 নয়? অর্থ্যাৎ ডলারে 100 সেন্ট কেন তাই কেবল 2 দশমিক স্থানের প্রয়োজন হয়? Amounts 9999.99 এর চেয়ে কম অর্থের একটি রেকর্ড সংরক্ষণ করার জন্য, আমি দশমিক এক ধরণের (6,2) ডেটা নিয়ে যাচ্ছিলাম। আমি বিভাজন বা গুণনের গণনার বিষয়ে উদ্বিগ্ন নই, কেবল সঞ্চয় এবং সংশ্লেষ ..
অ্যালান এফ

উত্তর:


326

কখনও কখনও আপনার অর্থ ব্যবহার করা উচিত নয়। এটি সুনির্দিষ্ট নয় এবং এটি খাঁটি আবর্জনা; সর্বদা দশমিক / সংখ্যা ব্যবহার করুন।

আমার অর্থটি বোঝার জন্য এটি চালান:

DECLARE
    @mon1 MONEY,
    @mon2 MONEY,
    @mon3 MONEY,
    @mon4 MONEY,
    @num1 DECIMAL(19,4),
    @num2 DECIMAL(19,4),
    @num3 DECIMAL(19,4),
    @num4 DECIMAL(19,4)

    SELECT
    @mon1 = 100, @mon2 = 339, @mon3 = 10000,
    @num1 = 100, @num2 = 339, @num3 = 10000

    SET @mon4 = @mon1/@mon2*@mon3
    SET @num4 = @num1/@num2*@num3

    SELECT @mon4 AS moneyresult,
    @num4 AS numericresult

আউটপুট: 2949.0000 2949.8525

এমন কিছু লোকের কাছে যারা বলেছিলেন যে আপনি অর্থের মাধ্যমে অর্থ ভাগ করবেন না:

পারস্পরিক সম্পর্কের গণনা করার জন্য আমার এই প্রশ্নের মধ্যে একটি, এবং এটি টাকায় পরিবর্তন করা ভুল ফলাফল দেয়।

select t1.index_id,t2.index_id,(avg(t1.monret*t2.monret)
    -(avg(t1.monret) * avg(t2.monret)))
            /((sqrt(avg(square(t1.monret)) - square(avg(t1.monret))))
            *(sqrt(avg(square(t2.monret)) - square(avg(t2.monret))))),
current_timestamp,@MaxDate
            from Table1 t1  join Table1 t2  on t1.Date = traDate
            group by t1.index_id,t2.index_id

61
"কখনই নয়" একটি শক্ত শব্দ। সংস্কৃতি-সংবেদনশীল উপায়ে ব্যবহারকারীর কাছে প্রদর্শন করার জন্য "অর্থ" সেই ধরণের ফলাফল কাস্টিংয়ের জন্য দরকারী তবে আপনি ঠিক বলেছেন যে গণনার জন্য এটি ব্যবহার করা খুব খারাপ।
জোয়েল কোহোর্ন

36
আপনার উদাহরণটি অর্থবহ নয়, যেহেতু কেউ কখনও অর্থের দুটি জিনিসকে গুণতে পারে না। আপনি যদি নিজের বিষয়টি প্রমাণ করতে চান, আপনাকে দশমিক দশমিক এক গুণ করে দশমিককে গুণিয়ে তুলতে হবে money
ব্রায়ান

27
.. তবে এটি এখনও বিস্মিত হচ্ছে কেন অর্থ * অর্থের অর্থের নির্ভুলতা থাকবে না।
শিখছি

4
@ শিখুন: এটিতে অর্থের নির্ভুলতা রয়েছে। যাইহোক, আপনি এখনও সময়ের সাথে জমে থাকা গোলাকার ত্রুটিগুলি শেষ করেন। দশমিক প্রকারটি বাইনারি পাটিগণিত ব্যবহার করে না: এটি আপনাকে কাগজে এটি করা থেকে একই বেস 10 ফলাফলের গ্যারান্টি দেয়।
জোয়েল কোহোর্ন

55
গুণন এবং বিভাজন moneyউপর moneyসরাইয়া, এই দৃষ্টন্ত 'ধান্দাবাজি হয়। এটি একটি দলিলযুক্ত সত্য যা moneyএকটি নির্দিষ্ট এবং খুব সীমিত নির্ভুলতা রয়েছে। এই জাতীয় ক্ষেত্রে প্রথমে এককে গুণ করা উচিত এবং তারপরে ভাগ করা উচিত। এই উদাহরণে অপারেটরদের ক্রম পরিবর্তন করুন এবং আপনি অভিন্ন ফলাফল পাবেন। একজন moneyমূলত 64-বিট int, এবং যদি আপনি ints সঙ্গে মোকাবেলা করতে ছিল, আপনি বিভাজক আগে সংখ্যাবৃদ্ধি হবে।
অ্যান্ড্রি এম

272

এসকিউএলমেনিস বলেছে যে অর্থ অযোগ্য। তবে আপনি অর্থ দিয়ে গুণকে / ভাগ করবেন না! 3 সেন্ট 50 ডলার গুন কত? ১৫০ ডলারেন্টস? আপনি স্কেলারের মাধ্যমে অর্থকে গুণিত / ভাগ করুন, যা দশমিক হওয়া উচিত।

DECLARE
@mon1 MONEY,
@mon4 MONEY,
@num1 DECIMAL(19,4),
@num2 DECIMAL(19,4),
@num3 DECIMAL(19,4),
@num4 DECIMAL(19,4)

SELECT
@mon1 = 100,
@num1 = 100, @num2 = 339, @num3 = 10000

SET @mon4 = @mon1/@num2*@num3
SET @num4 = @num1/@num2*@num3

SELECT @mon4 AS moneyresult,
@num4 AS numericresult

সঠিক ফলাফলের ফলাফল:

অর্থসংখ্যাসংখ্যার সংখ্যা
--------------------- ----------------------------- ----------
2949.8525 2949.8525

moneyযতক্ষণ না আপনার 4 দশমিকের বেশি সংখ্যার প্রয়োজন হয় না, এবং আপনি নিশ্চিত হন যে আপনার স্কেলারগুলি - যা অর্থ উপস্থাপন করে না - হয় decimal


57
এক ডলারের বিল আপনাকে কত শতাংশ মুদ্রা পেতে পারে? এর উত্তরের জন্য অর্থ / অর্থ প্রয়োজন।
শিখছি

48
@ সেক্ষেত্রে ফলস্বরূপ ফলাফলটি অর্থের নয়, ভাসমান। (বেসিক মাত্রিক বিশ্লেষণ।)
রিচার্ড

11
@ শিখুন: আপনি কি ডাটাবেসকে জিজ্ঞাসা করেন যে এক ডলারের মধ্যে কত সেন্ট? যাইহোক, যে সঠিক ফলাফল ফিরে আসবে। তার সমস্যাটি হ'ল অর্থ / অর্থ কেবল চারটি অঙ্কের (এটি 0.2949) সুনির্দিষ্ট ছিল, তারপরে 10000 দ্বারা গুণিত হয়ে তা 2949.0000 হয়ে যায়।
Configurator

26
@ এমসন তিনি সঠিক এবং আপনি যেমন এক লাইনের মন্তব্যের ভিত্তিতে করেছেন তেমন ব্যক্তিগত সমালোচনা করবেন না, এটি সহায়ক নয়। যদি সে $ 0.01 দ্বারা পরিবর্তে 0.01 দ্বারা ভাগ না করে তবে ফলাফলটি 100 এর পরিবর্তে 100 ডলার। এখানে ডলারের 100 সেন্ট রয়েছে, 100 ডলার নয়। ইউনিটগুলি গুরুত্বপূর্ণ! ডাইভিংয়ের জন্য অবশ্যই একটি বড় জায়গা রয়েছে এবং অর্থের মাধ্যমে সম্ভবত গুণমান।
অ্যান্ড্রুব

19
আমি যদি 36 ডলার মূল্যের স্টক শেয়ার কিনতে 1000 ডলার ব্যয় করতে চাই তবে এটি কি বৈধ ব্যবহার নয় money / money? উত্তরটি পুরো ইউনিট যার সাথে ডলারের চিহ্ন সংযুক্ত নেই, যা সঠিক! এটি পুরোপুরি যুক্তিসঙ্গত দৃশ্যাবলী, প্রস্তাব দেওয়া হয় যে এরকম অদ্ভুত প্রান্তের কারণে moneyব্যবহার করা ভাল ডেটা টাইপ নয়, ফলস্বরূপ moneyযথাযথতা এবং স্কেলের সাধারণ নিয়মগুলি অনুসরণ না করে সর্বদা ফিট হয়ে ফিরে যায় । আপনি যদি moneyমানগুলির একটি সেটের মানক বিচ্যুতি গণনা করতে চান ? হ্যাঁ, Sqrt(Sum(money * money))(সরলীকৃত) আসলে তাৎপর্যপূর্ণ।
এরিক

59

আপনি কী করছেন তা যদি আপনি না জানেন তবে সবকিছুই বিপজ্জনক

এমনকি উচ্চ-নির্ভুল দশমিক প্রকারগুলিও দিনটি বাঁচাতে পারে না:

declare @num1 numeric(38,22)
declare @num2 numeric(38,22)
set @num1 = .0000006
set @num2 = 1.0
select @num1 * @num2 * 1000000

1.000000 <- 0.6000000 হওয়া উচিত


moneyধরনের পূর্ণসংখ্যা

পাঠ্য উপস্থাপনা smallmoneyএবং decimal(10,4)একইভাবে চেহারা হতে পারে, কিন্তু তাদের বিনিমেয় দেখা যায় না। আপনি যখন খেজুর হিসাবে সঞ্চিত দেখেন তখন কি ক্রিঞ্জ করবেন varchar(10)? এই একই জিনিস।

পর্দার আড়ালে, money/ smallmoneyকেবল একটি bigint/ int পাঠ্য উপস্থাপনের দশমিক পয়েন্টটি moneyহ'ল এক মাই-মিমি-ডিডি তারিখের ড্যাশগুলির মতো ভিজ্যুয়াল ফ্লফ। এসকিউএল আসলে এগুলি অভ্যন্তরীণভাবে সংরক্ষণ করে না।

সংক্রান্ত decimalবনাম money, বাছাই যাই হোক না কেন আপনার প্রয়োজনের জন্য উপযুক্ত। moneyধরনের অস্তিত্ব কারণ 1 / 10000th ইউনিট এর পূর্ণসংখ্যা গুণিতক হিসাবে অ্যাকাউন্টিং সংরক্ষণকারী মান খুব সাধারণ। এছাড়াও, যদি আপনি সাধারণ সংযোজন এবং বিয়োগফলের বাইরে প্রকৃত অর্থ এবং গণনাগুলি নিয়ে কাজ করে থাকেন তবে আপনার ডাটাবেস স্তরে এটি করা উচিত নয়! ব্যাঙ্কারের রাউন্ডিং (আইইইই 754) সমর্থন করে এমন একটি লাইব্রেরি সহ অ্যাপ্লিকেশন পর্যায়ে এটি করুন


1
আপনি এই উদাহরণে কি ঘটেছে তা ব্যাখ্যা করতে পারেন?
সের্গে পপভ

4
স্কেল ওভারফ্লো ছোট আকারের স্কেলগুলিতে, সংখ্যাসূচক (ক, খ) * সংখ্যা (সি, ডি) সংখ্যার (এ-বি + সি-ডি + 1, সর্বাধিক (খ, ডি)) ফলন করে। তবে, যদি (a + b + c + d)> 38, এসকিউএল স্কেল ক্যাপ করে, ভগ্নাংশের দিক থেকে পূর্ণসংখ্যার দিকটি প্যাড করে যথাযথতা ছিনিয়ে নেয়, যার ফলে রাউন্ডিং ত্রুটি ঘটে।
আনন

সমস্ত সংখ্যার গণনাগুলি স্কেলিংয়ের কারণে নির্ভুলতা হ্রাসের পক্ষে সংবেদনশীল: পরিবর্তে গণনাটি 1000000 * @ num1 * @ num2 নির্বাচন করুন
মিচ গম

আননের উদাহরণ সংস্করণ এবং ডাটাবেস নির্দিষ্ট। তবে সাবধানতা অবলম্বন করা উচিত বৈধ। বর্গক্ষেত্রের 1.1 সংস্করণে, উদাহরণটি 0.600000 সঠিকভাবে দেয়। (আমি জানি আমরা এখানে এমএস এসকিউএল সম্পর্কে কথা বলছি)। অর্থের প্রকারের অন্যান্য ডাটাবেস থেকে অনুপস্থিত সম্পর্কে আরেকটি বিষয়, ডোমেন তৈরির মতো দশমিক বা সংখ্যাকে কল করার উপায় রয়েছে।
gg89

3
আমি মনে করি এটি সবচেয়ে আলোকিত উত্তর কারণ আপনি কেবল প্রচারিত ত্রুটিগুলি কেবল ব্যাখ্যা করেন নি, তবে সত্যিই কী ঘটনার পিছনে চলছে এবং অর্থ কেন প্রথম স্থানে রয়েছে। এই উত্তরটি পেতে কেন 4 বছর লেগেছিল তা আমি নিশ্চিত নই, তবে সম্ভবত এটি কারণ "সমস্যার" গণনাটিতে খুব বেশি মনোযোগ কেন্দ্রীভূত হয়েছে এবং দশমিকের তুলনায় হুইস এবং অর্থের পরিমাণের বিষয়ে এতটা নয়।
স্টিভ শেথার

44

আমি বুঝতে পারি যে ওয়েনএম বলেছেন যে তিনি জানেন যে এসকিউএল সার্ভারের জন্য অর্থ নির্দিষ্ট। তবে, তিনি জিজ্ঞাসা করছেন দশমিক বা তার বিপরীতে অর্থ ব্যবহারের কোনও কারণ আছে এবং আমি মনে করি যে একটি স্পষ্ট কারণ এখনও বলা উচিৎ এবং এটি দশমিক অর্থাত্ আপনার ডিবিএমএস পরিবর্তন করতে হবে কিনা তা নিয়ে চিন্তিত হওয়া কম জিনিস think - যা ঘটতে পারে

আপনার সিস্টেমগুলি যতটা সম্ভব নমনীয় করুন!


1
সম্ভবত, তবে তত্ত্ব হিসাবে আপনি অন্য ডিবিএমএসে অর্থ নামে একটি ডোমেন ঘোষণা করতে পারেন (এটি ডোমেনগুলির ঘোষণাকে সমর্থন করে)।
বিতর্ককারী

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

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

@ পানাগিওটিসকানাভোস - অর্থের অবচয় হয়নি
মার্টিন স্মিথ

@ মার্টিনস্মিত এটি দেখে হতবাক, যেহেতু এটি 2017 সালে বিটিসির মতো অর্থের মানগুলি পরিচালনা করতে পারে না Or বা জিবিপি এবং ইইউর পরিমাণের মধ্যে পার্থক্য করতে পারে - যদিও তারা সমতার দিকে এগিয়ে যায়: পি। যাইহোক,
রেডশিফটে

32

ভাল, আমি পছন্দ করি MONEY! এটি তুলনায় একটি বাইট কম সস্তা DECIMALএবং গণনাগুলি দ্রুত সম্পাদন করে কারণ (আচ্ছাদনগুলির নীচে) সংযোজন এবং বিয়োগ অপারেশনগুলি মূলত পূর্ণসংখ্যার ক্রিয়াকলাপ। @ এসকিউএলমেনিসের উদাহরণ — যা অজান্তের জন্য একটি দুর্দান্ত সতর্কতা INTe ইগারদের ক্ষেত্রেও সমানভাবে প্রয়োগ করা যেতে পারে , যেখানে ফলাফলটি শূন্য হবে। তবে এটি পূর্ণসংখ্যার ব্যবহার না করার কোনও কারণ নয় — যেখানে উপযুক্ত

সুতরাং, এটি পুরোপুরি 'নিরাপদ' এবং MONEYআপনি যখন ব্যবহার করছেন সেটি ব্যবহার করার উপযুক্ত এবং MONEYএটি অনুসরণ করা গাণিতিক নিয়ম অনুসারে ব্যবহার করুন ( INTইজার হিসাবে একই )।

এটা ভালো হবে যদি SQL সার্ভার বিভাগ এবং গুণ উন্নীত MONEYমধ্যে s ' DECIMALগুলি (বা FLOAT- সম্ভবত, কিন্তু তারা এই কাজ করতে পছন্দ করে করা হয়নি গুলি?); বা INTএগারদের FLOATভাগ করার সময় তারা প্রচার করতে পছন্দ করেনি ।

MONEYকোন যথার্থ সমস্যা আছে; যে DECIMALগুলি একটি বৃহত্তর অন্তর্বর্তী গণনার সময় ব্যবহৃত টাইপ মাত্র একটি করে টাইপ ব্যবহার 'বৈশিষ্ট্য' আছে পেতে (এবং আমি আসলে নিশ্চিত কতদূর যে 'বৈশিষ্ট্য' প্রসারিত নই)।

নির্দিষ্ট প্রশ্নের উত্তর দিতে, একটি "বাধ্যতামূলক কারণ"? ঠিক আছে, আপনি যদি এমন কোনও SUM(x)ক্ষেত্রে নিখুঁত সর্বাধিক পারফরম্যান্স চান বা যেখানে xহতে পারে তবে তার কিনারা থাকবে।DECIMALMONEYMONEY

এছাড়াও, ভুলে যাবেন না যে এটি ছোট চাচাত ভাই, SMALLMONEY4 বাইট ঠিক করুন, তবে এটি সর্বোচ্চ 214,748.3647পরিমাণে দেয় - যা অর্থের জন্য খুব ছোট — এবং তাই প্রায়শই ভাল ফিট হয় না।

বৃহত্তর মধ্যবর্তী ধরনের ব্যবহার করে চারপাশের বিষয়টি প্রমাণ করার জন্য, আপনি যদি মধ্যবর্তীটিকে স্পষ্টভাবে কোনও ভেরিয়েবলের জন্য বরাদ্দ করেন DECIMALতবে একই সমস্যা ভোগ করে:

declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)

select @a = 100, @b = 339, @c = 10000

set @d = @a/@b

set @d = @d*@c

select @d

উত্পাদিত হয় 2950.0000(ঠিক আছে, সুতরাং কমপক্ষে DECIMALচেয়ে কম বৃত্তাকার MONEYan একটি পূর্ণসংখ্যার মতো।)


21
MONEYএক বাইট একটি কম বড় DECIMAL , স্পষ্টতা 19 সংখ্যায় পর্যবসিত দিয়ে। তবে, বেশিরভাগ আসল-বিশ্ব মুদ্রণ গণনা ($ 9.99 এম পর্যন্ত) একটিতে ফিট করতে পারে DECIMAL(9, 2), যার জন্য মাত্র পাঁচ বাইট প্রয়োজন। আপনি আকার বাঁচাতে পারবেন, গোল করার ত্রুটি সম্পর্কে কম চিন্তা করতে পারেন এবং আপনার কোডটিকে আরও পোর্টেবল করতে পারেন।

@ জোনফএলট্রেডস সঠিক হলেও, আপনি কেবল পেনি বা সেন্ট সমেত একটি পূর্ণসংখ্যার ব্যবহার করে পূর্ণসংখ্যার পারফরম্যান্স ফিরে পেতে পারেন এবং দশমিক পয়েন্টের অবস্থানটি এনকোড করে অতিরিক্ত বাইট সংরক্ষণ করতে পারেন এবং দশমিক একসাথে যুক্ত করার সময় যা পরীক্ষা করা উচিত।
ডিএসজি

"সুতরাং, এটি পুরোপুরি 'নিরাপদ' এবং আপনি যে বিষয়টি নিয়ে যা যা করছেন তা অর্থের সাথে ব্যবহার করা উপযুক্ত এবং এটি অনুসরণ করা গাণিতিক নিয়ম অনুসারে ব্যবহার করুন" -> তবে আননের উত্তরও দেখুন: "আপনি যদি না করেন তবে সবকিছুই বিপজ্জনক জানেন আপনি কি করছেন "। আপনি কখনই ভবিষ্যদ্বাণী করতে পারবেন না যে কীভাবে লোকেরা আপনার তৈরি করা সিস্টেমটি অনুসন্ধান করছে, আপনি যখন পারেন তখন অপব্যবহারের সম্ভাবনা এড়াতে ভাল to স্টোরেজে বিয়োগফলের লাভ এটি আইএমএইচওর পক্ষে মূল্যবান নয়।
নাথান গ্রিফিথস

1
একটি বিটকয়েন মান সংরক্ষণ করার চেষ্টা করুন। এটির 8 টি দশমিক রয়েছে
পানাজিওটিস কানভোস

13

আমরা সবেমাত্র একটি খুব অনুরূপ ইস্যুটি নিয়ে এসেছি এবং শীর্ষ স্তরের উপস্থাপনা ব্যতীত কখনই অর্থ ব্যবহার না করার জন্য আমি এখন অনেক বেশি একটি +1। আমাদের একাধিক টেবিল রয়েছে (কার্যকরভাবে বিক্রয় ভাউচার এবং বিক্রয় চালান) যার প্রত্যেকটিতে oneতিহাসিক কারণে এক বা একাধিক অর্থ ক্ষেত্র রয়েছে এবং মোট চালানের ট্যাক্সের পরিমাণের সাথে কতটুকু প্রাসঙ্গিক তা নির্ধারণের জন্য আমাদের একটি প্রো-রেটা গণনা করা দরকার we বিক্রয় ভাউচার লাইন। আমাদের গণনা হয়

vat proportion = total invoice vat x (voucher line value / total invoice value)

এটি প্রকৃত বিশ্বের অর্থ / অর্থের গণনার ফলাফল দেয় যা বিভাজনের অংশে স্কেল ত্রুটি সৃষ্টি করে, যা পরে ভুল ভ্যাট অনুপাতে গুন করে। যখন এই মানগুলি পরে যুক্ত করা হয়, আমরা মোট ভ্যাট অনুপাতের সমাপ্তি করি যা মোট চালানের মান যোগ করে না। বন্ধনীগুলির মানগুলির মধ্যে যদি দশমিক হত (আমি তাদের মধ্যে একটির মতোই ফেলেছি) ভ্যাট অনুপাতটি সঠিক হবে।

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


8
তবে এটি কেবল তাই ঘটে কারণ একজন অজ্ঞ বিকাশকারী ভ্যাট গণনার জন্য বিধি এবং অর্থের ডকুমেন্টেড যথার্থ সীমাবদ্ধতা উপেক্ষা করে।
টমটম

1
@ টমটম কিন্তু আপনি এই তথ্য টাইপের অপব্যবহারের সম্ভাবনাটি সম্পর্কে যে বিষয়টি তৈরি করছেন সেটি একেবারেই এড়িয়ে চলার পক্ষে পক্ষে যুক্তি।
নাথান গ্রিফিথস

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

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

@ টমটম এটি কেবল নির্ভুলতার সীমাবদ্ধতা নয়। অভ্যন্তরীণ উপস্থাপনাও সমস্যার কারণ হতে পারে। অজ্ঞ বিকাশকারীদের ধরার জন্য অর্থ হ'ল সুবিধার ধরণ, এমন কোনও দুর্দান্ত ধরণের নয় যা বিকাশকারীরা অপব্যবহার করে। ভ্যাট উদাহরণ, এটি গণনা করার নিয়ম নির্বিশেষে, অজ্ঞান বিকাশকারীদের জেনারেলের সাথে নির্দিষ্ট প্রয়োগ করার পরে স্পষ্টভাবে তাদের ভয় দেখাতে হবে।
জেরার্ড ওনিল

12

অন্যান্য উত্তরের সাধারণ চাপের পাল্টা পয়েন্ট হিসাবে। অর্থের অনেক উপকারিতা দেখুন ... ডেটা টাইপ! মধ্যে রিলেশনাল Engine এ SQLCAT নির্দেশিকা

বিশেষত আমি নিম্নলিখিতটি নির্দেশ করব

গ্রাহক বাস্তবায়নে কাজ করে আমরা মানি ডেটা ধরণের বিষয়ে কিছু আকর্ষণীয় পারফরম্যান্স নম্বর পেয়েছি। উদাহরণস্বরূপ, এসকিউএল সার্ভারের অর্থ ডেটা টাইপের সাথে মেলানোর জন্য যখন বিশ্লেষণ পরিষেবাদিগুলি মুদ্রার ডেটা টাইপের (ডাবল থেকে) সেট করা হয়েছিল তখন প্রক্রিয়াকরণের গতিতে 13% উন্নতি হয়েছিল (সারি / সেকেন্ড)। এসএসআইএস সার্ভার ইন্টিগ্রেশন সার্ভিসেস (এসএসআইএস) এর মধ্যে ত্রিশ মিনিটের মধ্যে 1.18 টিবি লোড করতে দ্রুত পারফরম্যান্স পাওয়ার জন্য, এসএসআইএস ২০০৮-তে উল্লিখিত হিসাবে - বিশ্ব রেকর্ড ইটিএল পারফরম্যান্সে দেখা গেছে যে আকারের চারটি দশমিক (9,2) কলাম পরিবর্তন করে টিপিসি-এইচ লাইনটিআই-এ টেবিল টু 5 বাইট (8 বাইট) বাল্ক সন্নিবেশের গতি 20% উন্নত করেছে ... পারফরম্যান্স উন্নতির কারণ এসকিউএল সার্ভারের ট্যাবুলার ডেটা স্ট্রিম (টিডিএস) প্রোটোকল, যার মধ্যে কমপ্যাক্ট বাইনারি আকারে এবং এসকিউএল সার্ভারের অভ্যন্তরীণ স্টোরেজ ফর্ম্যাটটিতে যতটা সম্ভব নিকটস্থ ডেটা স্থানান্তর করার মূল নকশার নীতি রয়েছে। অভিজ্ঞতার সাথে, এসএসআইএস ২০০৮-এর সময় এটি পর্যবেক্ষণ করা হয়েছিল - কার্নারেট ব্যবহার করে বিশ্ব রেকর্ড ইটিএল পারফরম্যান্স পরীক্ষার; প্রোটোকলটি উল্লেখযোগ্যভাবে হ্রাস পেয়েছে যখন ডেটা টাইপ দশমিক থেকে অর্থের দিকে স্যুইচ করা হয়েছিল। এটি ডেটা স্থানান্তর যতটা সম্ভব দক্ষ করে তোলে। একটি জটিল ডেটা টাইপের স্থির-প্রস্থের ধরণের চেয়ে হ্যান্ডল করার জন্য অতিরিক্ত পার্সিং এবং সিপিইউ চক্রের প্রয়োজন।

সুতরাং প্রশ্নের উত্তর "এটি নির্ভর করে"। যথাযথতা রক্ষার জন্য আপনাকে নির্দিষ্ট গাণিতিক ক্রিয়াকলাপগুলির সাথে আরও সতর্কতা অবলম্বন করতে হবে তবে আপনি দেখতে পাচ্ছেন যে পারফরম্যান্স বিবেচনার ফলে এটি সার্থক হয়।


আপনি কীভাবে তখন বিটকয়েন সংরক্ষণ করবেন ?
পানাজিওটিস কানভোস

@ পানাগিওটিসকানাভস - আমার কোনও ধারণা নেই। আমি কখনই বিটকয়েনের দিকে নজর রাখিনি এবং এটি সম্পর্কে ব্যবহারিকভাবে কিছুই জানি না!
মার্টিন স্মিথ

6

আমি অর্থ বনাম NUMERICAL এর ভিন্ন দৃষ্টিভঙ্গি দিতে চাই, মূলত আমার নিজস্ব দক্ষতা এবং অভিজ্ঞতা ভিত্তিক ... এখানে আমার দৃষ্টিভঙ্গি অর্থের বিষয়, কারণ আমি এটির সাথে দীর্ঘ সময় ধরে কাজ করেছি এবং সত্যই কখনও NUMERICAL ব্যবহার করি নি .. ।

অর্থ প্রো:

  • নেটিভ ডাটা টাইপ । এটি সিপিইউ নিবন্ধকের মতোই একটি নেটিভ ডেটা টাইপ ( পূর্ণসংখ্যা ) ব্যবহার করে (৩২ বা 64৪ বিট), সুতরাং গণনাটি অপ্রয়োজনীয় ওভারহেডের প্রয়োজন হয় না তাই এটি আরও ছোট এবং দ্রুত ... অর্থের জন্য 8 বাইট এবং NUMERICAL (19, 4) প্রয়োজন ) 9 বাইট প্রয়োজন (12.5% ​​বড়) ...

    অর্থটি যতক্ষণ তা ব্যবহার করা হয় যতক্ষণ এটি (অর্থ হিসাবে) বোঝানো হত। কত দ্রুত? SUM1 মিলিয়ন ডেটাতে আমার সহজ পরীক্ষাটি দেখায় যে অর্থ 275 এমএস এবং NUMERIC 517 এমএস ... এটি প্রায় দ্বিগুণ দ্রুত ... এসইউএম পরীক্ষা কেন? পরবর্তী প্রো পয়েন্ট দেখুন

  • মানি জন্য সর্বোত্তম । অর্থ সঞ্চয় এবং অপারেশন করার জন্য অর্থ সর্বোত্তম, উদাহরণস্বরূপ, অ্যাকাউন্টিংয়ে। একটি একক প্রতিবেদন লক্ষ লক্ষ সংযোজন (এসইউএম) এবং এসএমএম অপারেশন হওয়ার পরে কয়েকটি গুণকে চালাতে পারে। খুব বড় অ্যাকাউন্টিং অ্যাপ্লিকেশনগুলির জন্য এটি প্রায় দ্বিগুণ দ্রুত এবং এটি অত্যন্ত তাৎপর্যপূর্ণ ...
  • মানি কম যথার্থ । বাস্তব জীবনের অর্থ খুব সুনির্দিষ্ট হওয়ার দরকার নেই। আমি বলতে চাইছি, অনেক লোক 1 শতাংশ মার্কিন ডলার সম্পর্কে যত্ন নিতে পারে তবে 0.01 সেন্ট মার্কিন ডলার কীভাবে? প্রকৃতপক্ষে, আমার দেশে, ব্যাংকগুলি এখন সেন্টের বিষয়ে চিন্তা করে না (দশমিক কমা পরে অঙ্ক); আমি মার্কিন ব্যাংক বা অন্য দেশ সম্পর্কে জানি না ...

অর্থ কন

  • সীমাবদ্ধ যথার্থতা । অর্থের চারটি অঙ্ক (কমা পরে) নির্ভুলতা থাকে, সুতরাং বিভাগ হিসাবে কাজ করে আগে এটি রূপান্তর করতে হবে ... তবে তারপরে আবার moneyএত নির্ভুল হওয়া প্রয়োজন হয় না এবং অর্থ হিসাবে ব্যবহৃত হয়, কেবল একটি নয় সংখ্যা ...

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


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

3
@ HaakonLøtveit এই পুরো প্রশ্নোত্তর থ্রেডটি এসকিউএল সার্ভারের ডেটা টাইপ "অর্থ" সম্পর্কে, সুতরাং আমি মনে করি না যে উত্তরটিতে তাদের এটি নির্দিষ্ট করা দরকার। কিছু পরিস্থিতিতে দশমিকের চেয়ে অর্থের ব্যবহার আরও দ্রুত হতে পারে (উদাহরণস্বরূপ ডেটা লোড করা), আরও তথ্যের জন্য মার্টিন স্মিথের উত্তর দেখুন। আমি এই উত্তরের বেশিরভাগ অংশের সাথে একমত, এটিতে এমন কিছু নির্দিষ্ট ব্যবহারের ঘটনা রয়েছে যা অর্থের দশমিকের চেয়ে আরও বেশি কার্যকর পছন্দ করে তুলতে পারে, তবে এটি ব্যবহারের জন্য খুব জোরালো মামলা না থাকলে আমি মনে করি এটি এড়ানো উচিত।
নাথান গ্রিফিথস

1
বিটকয়েনের 8 দশমিক। এমনকি আপনি একটি এ সঞ্চয় করতে পারবে না moneyকলাম
Panagiotis Kanavos

4

পূর্ববর্তী সমস্ত পোস্ট বৈধ পয়েন্ট নিয়ে আসে, তবে কিছু প্রশ্নের সঠিক উত্তর দেয় না।

প্রশ্নটি হ'ল: কেউ কেন অর্থকে অগ্রাধিকার দেবে যখন আমরা ইতিমধ্যে জানি যে এটি একটি সুনির্দিষ্ট ডেটা টাইপ এবং জটিল গণনায় ব্যবহৃত হলে ত্রুটি সৃষ্টি করতে পারে?

যখন আপনি জটিল গণনা করবেন না এবং আপনি অন্যান্য প্রয়োজনীয়তার জন্য এই নির্ভুলতা বাণিজ্য করতে পারেন তখন আপনি অর্থ ব্যবহার করেন।

উদাহরণস্বরূপ, যখন আপনাকে সেই গণনাগুলি করতে হবে না এবং আপনার বৈধ মুদ্রার পাঠ্য স্ট্রিংগুলি থেকে ডেটা আমদানি করতে হবে। এই স্বয়ংক্রিয় রূপান্তরটি কেবল অর্থের ধরণের সাথে কাজ করে:

SELECT CONVERT(MONEY, '$1,000.68')

আমি জানি আপনি নিজের আমদানি রুটিন তৈরি করতে পারেন। তবে কখনও কখনও আপনি বিশ্বব্যাপী নির্দিষ্ট স্থানীয় ফর্ম্যাটগুলির সাথে আমদানির রুটিনটি পুনরায় তৈরি করতে চান না।

আর একটি উদাহরণ, যখন আপনাকে সেই গণনাগুলি করতে হবে না (আপনার কেবলমাত্র একটি মূল্য সঞ্চয় করতে হবে) এবং 1 বাইট সংরক্ষণ করতে হবে (অর্থ 8 বাইট এবং দশমিক (19,4) লাগে 9 বাইট)) কিছু অ্যাপ্লিকেশনগুলিতে (দ্রুত সিপিইউ, বিগ র‍্যাম, স্লো আইও) যেমন বিপুল পরিমাণে ডেটা পড়ার মতো এটিও দ্রুত হতে পারে।


2

যখন আপনাকে মানটির গুণক / বিভাগগুলি করার দরকার হয় তখন আপনাকে অর্থ ব্যবহার করা উচিত নয়। দশমিক দশমিক দশমিক দশমিক এক অঙ্ক হিসাবে অঙ্ক করা হয়, যেখানে কোনও পূর্ণসংখ্যা সংরক্ষণ করা হয় Money এর অর্থ হল যে বেশিরভাগ ক্ষেত্রে অর্থ নির্ভুলতা নেমে আসবে, দশমিক কেবল যখন এটির মূল স্কেলে রূপান্তরিত হবে তখনই তা করবে। অর্থ স্থির বিন্দু, সুতরাং গণনার সময় এর স্কেল পরিবর্তন হয় না। তবে এটি নির্দিষ্ট পয়েন্ট হওয়ার সাথে সাথে যখন এটি দশমিক স্ট্রিং হিসাবে মুদ্রিত হয় (বেস 2 স্ট্রিংয়ের স্থির অবস্থান হিসাবে বিপরীতে), 4 এর স্কেল পর্যন্ত মানগুলি হুবহু উপস্থাপন করা হয়। সুতরাং সংযোজন এবং বিয়োগের জন্য, অর্থ ঠিক আছে।

দশমিক দশমিক 10 বেস অভ্যন্তরীণভাবে প্রতিনিধিত্ব করা হয়, এবং এইভাবে দশমিক পয়েন্ট অবস্থান 10 বেস উপর ভিত্তি করে। যা এর ভগ্নাংশটি অর্থের মতো ঠিক তার মানটিকে উপস্থাপন করে। পার্থক্যটি হ'ল দশমিকের মধ্যবর্তী মানগুলি 38 টি সংখ্যা পর্যন্ত যথার্থতা বজায় রাখতে পারে।

একটি ভাসমান পয়েন্ট সংখ্যা সহ, মানটি বাইনারিতে সংরক্ষণ করা হয় যেন এটি একটি পূর্ণসংখ্যা এবং দশমিক (বা বাইনারি, আহেম) পয়েন্টের অবস্থানটি সংখ্যার প্রতিনিধিত্বকারী বিটের সাথে সম্পর্কিত। এটি একটি বাইনারি দশমিক বিন্দু হওয়ায় দশমিক বিন্দুর পরে বেস 10 সংখ্যা যথাযথতা হারাবে। 1/5 তম বা 0.2, এইভাবে সঠিকভাবে উপস্থাপন করা যাবে না। অর্থ বা দশমিক কেউই এই সীমাবদ্ধতায় ভোগেন না।

অর্থকে দশমিক রূপান্তর করা, গণনা সম্পাদন করা এবং তারপরে প্রাপ্ত মানটি কোনও অর্থ ক্ষেত্র বা পরিবর্তনশীলতে সঞ্চয় করা যথেষ্ট সহজ।

আমার পিওভির কাছ থেকে, আমি এমন জিনিস চাই যা সংখ্যার সাথে ঘটেছিল তাদের খুব বেশি চিন্তা না করেই ঘটবে। যদি সমস্ত গণনা দশমিক রূপান্তরিত হতে চলেছে, তবে আমার কাছে আমি কেবলমাত্র দশমিকটি ব্যবহার করতে চাই। আমি প্রদর্শনের উদ্দেশ্যে অর্থ ক্ষেত্রটি সঞ্চয় করতাম।

আকার অনুসারে আমি আমার মন পরিবর্তন করতে যথেষ্ট পার্থক্য দেখতে পাচ্ছি না। অর্থ লাগে 4 - 8 বাইট, যেখানে দশমিক 5, 9, 13 এবং 17 হতে পারে 9 9 বাইট 8 বাইট পুরো টানা পারে তা পুরো কভার করতে পারে। সূচক অনুযায়ী (তুলনা এবং অনুসন্ধানের তুলনামূলক হওয়া উচিত)।


আপভোটের জন্য ধন্যবাদ আমি এটি দেখছি এবং আমি যা বলার চেষ্টা করছিলাম তা পাবার সময় আমি এটি খুব বিভ্রান্তিকর অবস্থায় দেখতে পাচ্ছি। সম্ভবত আমি এটি দশমিক কয়েকটি বনাম দশমিক উদাহরণ দিয়ে আবার লিখব।
জেরার্ড ওনিল

2

আমি নির্ভুলতার বিষয়ে দশমিকের চেয়ে বেশি অর্থের ব্যবহার সম্পর্কে একটি কারণ খুঁজে পেয়েছি।

DECLARE @dOne   DECIMAL(19,4),
        @dThree DECIMAL(19,4),
        @mOne   MONEY,
        @mThree MONEY,
        @fOne   FLOAT,
        @fThree FLOAT

 SELECT @dOne   = 1,
        @dThree = 3,    
        @mOne   = 1,
        @mThree = 3,    
        @fOne   = 1,
        @fThree = 3

 SELECT (@dOne/@dThree)*@dThree AS DecimalResult,
        (@mOne/@mThree)*@mThree AS MoneyResult,
        (@fOne/@fThree)*@fThree AS FloatResult

দশমিক ফলাফল> 1.000000

মানি ফলাফল> 0.9999

ফ্লোটআরসাল্ট> ১

কেবল এটি পরীক্ষা করুন এবং আপনার সিদ্ধান্ত নিন।


2
আমরা আপনার উপসংহারটি শুনতে (পড়ার মতো,) শুনতে চাই ।
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন আমি মনে করি যদি আমি অর্থ এবং দশমিক ধরণের মধ্যে পরিপূর্ণতা এবং নির্ভুলতা পেতে চাই তবে আমার সিদ্ধান্তটি দশমিক এক হওয়া উচিত।
কিউমাস্টার

1
উপরের প্রকৃত ফলাফলের সাথে আপনার উত্তর আপডেট করার বিষয়ে বিবেচনা করুন। তারপরে আপনার উপসংহার যে কেউ পড়তে তাৎক্ষণিকভাবে স্পষ্ট হবে :-)
Agreax

1
@ এজেক্স ফলাফল উত্তরে যুক্ত হয়েছে।
কিউমাস্টার

1

আমি কেবল এই ব্লগ এন্ট্রিটি দেখেছি: এসকিউএল সার্ভারে অর্থ বনাম দশমিক

যা মূলত বলে যে অর্থের একটি নির্ভুল সমস্যা আছে ...

declare @m money
declare @d decimal(9,2)

set @m = 19.34
set @d = 19.34

select (@m/1000)*1000
select (@d/1000)*1000

জন্য moneyটাইপ, আপনি 19.30 পরিবর্তে 19,34 পাবেন। আমি নিশ্চিত নই যে এমন কোনও অ্যাপ্লিকেশন পরিস্থিতি রয়েছে যা গণনার জন্য 1000 টি অংশে অর্থ বিভক্ত করে, তবে এই উদাহরণটি কিছু সীমাবদ্ধতা প্রকাশ করে।


15
এটি কোনও "ইস্যু" নয়, এটি "প্রতি নির্দিষ্টকরণের ভিত্তিতে ": represent moneyএবং smallmoneyউপাত্তের ধরণগুলি যে প্রতিনিধিত্ব করে সেই আর্থিক ইউনিটগুলির দশ-হাজার ভাগের কাছে নির্ভুল » যেমনটি এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms179882.aspx এ বলেছে তাই "এটি আবর্জনা" বলছে এমন কেউ জানেনা যে সে কী সম্পর্কে কথা বলছে।
আলবিরিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.