অ্যাক্টিভেকর্ডে ভাসা বনাম দশমিক


283

কখনও কখনও, অ্যাক্টিভাইকর্ড ডেটা টাইপ আমাকে বিভ্রান্ত করে। ত্রুটি, প্রায়শই। আমার চিরন্তন প্রশ্নগুলির মধ্যে একটি হল একটি প্রদত্ত মামলার জন্য,

আমার ব্যবহার করা উচিত :decimalনাকি :float?

আমি প্রায়শই এই লিঙ্কটি জুড়ে এসেছি, অ্যাক্টিভেকর্ড:: দশমিক বনাম: ভাসা? , তবে উত্তরগুলি আমার পক্ষে যথেষ্ট নিশ্চিত নয়:

আমি অনেক থ্রেড দেখেছি যেখানে লোকেরা ফ্ল্যাট ব্যবহার না করে এবং সর্বদা দশমিক ব্যবহার না করার জন্য ফ্ল্যাট আউট করার পরামর্শ দেয়। আমি বৈজ্ঞানিক অ্যাপ্লিকেশনগুলির জন্য ভাসমান ব্যবহারের জন্য কিছু লোকের পরামর্শও দেখেছি।

এখানে কয়েকটি উদাহরণস্বরূপ:

  • ভৌগলিক / অক্ষাংশ / দ্রাঘিমাংশ: -45.756688, 120.5777777, ...
  • অনুপাত / শতাংশ: 0.9, 1.25, 1.333, 1.4143, ...

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

  • প্রতিটি ব্যবহারের সুবিধা / অসুবিধাগুলি কী কী?
  • কোন ধরণের ব্যবহার করতে হবে তা জানার জন্য থাম্বের কিছু ভাল নিয়ম কী হবে?

উত্তর:


427

আমার স্মরণে আছে আমার কমপসসি অধ্যাপক মুদ্রার জন্য কখনও ভাসা ব্যবহার করবেন না।

এর কারণ কীভাবে আইইইই স্পেসিফিকেশন বাইনারি বিন্যাসে ভাসমান সংজ্ঞা দেয় । মূলত, এটি ফ্লোটকে উপস্থাপনের জন্য সাইন, ভগ্নাংশ এবং ঘনিষ্টর সঞ্চয় করে। এটি বাইনারি (যেমন কিছু +1.43*10^2) জন্য একটি বৈজ্ঞানিক স্বরলিপি মত । তার কারণে, ভাসা এবং দশমিকগুলি ঠিক ফ্লোটে সঞ্চয় করা অসম্ভব।

এজন্য একটি দশমিক বিন্যাস আছে। আপনি যদি এটি করেন:

irb:001:0> "%.47f" % (1.0/10)
=> "0.10000000000000000555111512312578270211815834045" # not "0.1"!

আপনি যদি না শুধুমাত্র যদি

irb:002:0> (1.0/10).to_s
=> "0.1" # the interprer rounds the number for you

সুতরাং আপনি যদি সংক্ষিপ্ততর আগ্রহগুলি, বা এমনকি ভূ-স্থানের মতো ছোট ছোট ভগ্নাংশ নিয়েও কাজ করে থাকেন তবে আমি অত্যন্ত দশমিক ফর্ম্যাটটি সুপারিশ করব, যেহেতু দশমিক বিন্যাসে 1.0/10হুবহু 0.1।

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

require "benchmark" 
require "bigdecimal" 

d = BigDecimal.new(3) 
f = Float(3)

time_decimal = Benchmark.measure{ (1..10000000).each { |i| d * d } } 
time_float = Benchmark.measure{ (1..10000000).each { |i| f * f } }

puts time_decimal 
#=> 6.770960 seconds 
puts time_float 
#=> 0.988070 seconds

উত্তর

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

ব্যবহারের দশমিক যদি আপনি সংখ্যার যে ভালো হবে এবং সঠিক সংখ্যা পর্যন্ত SUM (মিট আগ্রহ ও টাকা-সম্পর্কিত কিছু মত) করার প্রয়োজনীয়তা সঙ্গে তার আচরণ করছে। মনে রাখবেন: আপনার যদি নির্ভুলতার প্রয়োজন হয় তবে আপনার সর্বদা দশমিক ব্যবহার করা উচিত।


সুতরাং যদি আমি সঠিকভাবে বুঝতে পারি, ভাসাটি বেস -২ এ থাকে তবে দশমিক বেস -১০ এ থাকে? ভাসমান জন্য ভাল ব্যবহার কি হবে? আপনার উদাহরণটি কী করে এবং প্রদর্শন করে?
জোনাথন এলার্ড

1
আপনি না +1.43*2^10চেয়ে মানে +1.43*10^2?
ক্যামেরন মার্টিন

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

1
@ অ্যাডজি ঠিক: বিগডিসিমালও মুদ্রার পক্ষে একটি দুর্বল পছন্দ।
এরিক ডুমিনিল

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

19

Ails.২.১৮, ails স্যুইচিং: ফ্লোট আমাদের জন্য এই সমস্যাটি সমাধান করেছে।

শিখানো পাঠটি হ'ল "সর্বদা একজাতীয় উন্নয়ন এবং স্থাপনার ডেটাবেস ব্যবহার করুন!"


3
ভালো কথা, রিয়েলগুলি করার 3 বছর পরে আমি আন্তরিকভাবে সম্মতি জানাই।
জোনাথন এলার্ড

3
"সর্বদা একজাতীয় উন্নয়ন এবং স্থাপনার ডেটাবেস ব্যবহার করুন!"
zx1986

15

4.1.0 রেলগুলিতে, আমি মাইএসকিএল ডেটাবেজে অক্ষাংশ এবং দ্রাঘিমাংশ সংরক্ষণে সমস্যার সম্মুখীন হয়েছি। এটি ভাসমান ডেটা টাইপের সাহায্যে বড় ভগ্নাংশ নম্বর সংরক্ষণ করতে পারে না। এবং আমি ডেটা টাইপ দশমিক এবং আমার জন্য কাজ করে পরিবর্তন।

  Def পরিবর্তন
    পরিবর্তন_ কলাম: শহরগুলি, অক্ষাংশ,: দশমিক,: নির্ভুলতা => 15,: স্কেল => 13
    পরিবর্তন_ কলাম: শহরগুলি, দ্রাঘিমাংশ:: দশমিক,: নির্ভুলতা => 15,: স্কেল => 13
  শেষ

আমি আমার: অক্ষাংশ এবং: পোস্টগ্রিসে ভাসমান হিসাবে দ্রাঘিমাংশ সংরক্ষণ করি এবং এটি ঠিক কাজ করে।
স্কট ডব্লিউ

3
@ রবিকুল: হ্যাঁ, এটি বেশ ভাল, তবে ওভারকিল। decimal(13,9) অক্ষাংশ এবং দ্রাঘিমাংশ জন্য যথেষ্ট। @ স্কটডব্লু: আমার মনে নেই, তবে পোস্টগ্র্রেস যদি আইইইই ফ্লোট ব্যবহার করে তবে এটি কেবল "ভাল কাজ করে" কারণ আপনি সমস্যাগুলির মধ্যে পড়ে না ... ইইইটি। অক্ষাংশ এবং দ্রাঘিমাংশের জন্য এটি অপর্যাপ্ত বিন্যাস। আপনার অবশেষে কমপক্ষে উল্লেখযোগ্য অঙ্কগুলিতে ত্রুটি থাকবে।
লোনি এলোয়াস

@ লনিএচাস আইআইইই ভাসমান ল্যাট / লম্বা জন্য অপর্যাপ্ত করে তোলে?
আলেকজান্ডার সুর্যাপেল

3
@ আলেকজান্ডারসুরফেল আপনি যদি দশমিক অক্ষাংশ এবং দ্রাঘিমাংশ ব্যবহার করে থাকেন তবে কোনও আইইইই ফ্ল্যাট কমপক্ষে উল্লেখযোগ্য অঙ্কগুলিতে ত্রুটিগুলির পক্ষে সংবেদনশীল। সুতরাং আপনার অক্ষাংশ এবং দ্রাঘিমাংশের উদাহরণস্বরূপ 1 মিটার নির্ভুলতা থাকতে পারে তবে আপনার 100 মিটার বা তারও বেশি ত্রুটি থাকতে পারে। আপনি যদি গণনায় এগুলি ব্যবহার করেন তবে এটি বিশেষভাবে সত্য।
লোনি এলোয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.