দশমিক একটি ডাবল ভেরিয়েবল কাস্ট করুন


96

কিভাবে এক Cast হল একটি করে doubleকরতে decimalযা মুদ্রা উন্নয়ন করছেন ব্যবহার করা হয়। কোথায় Mযায়?

decimal dtot = (decimal)(doubleTotal);

উত্তর:


85

আপনি কেবলমাত্র Mএকটি সংখ্যাসূচক আক্ষরিক জন্য ব্যবহার করেন , যখন আপনি এটি ঠিক কাস্ট করেন:

decimal dtot = (decimal)doubleTotal;

নোট করুন যে একটি ভাসমান পয়েন্ট নম্বর সঠিক মান রাখতে উপযুক্ত নয়, সুতরাং আপনি যদি প্রথমে সংখ্যার যোগ করেন এবং তারপরে রূপান্তর করেন তবে Decimalরাউন্ডিং ত্রুটি হতে পারে। আপনি সংখ্যাগুলি Decimalএকসাথে যুক্ত করার আগে রূপান্তর করতে চাইতে পারেন , বা নিশ্চিত করুন যে সংখ্যাগুলি প্রথম স্থানে ভাসমান পয়েন্ট সংখ্যা নয়।


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

4
@ কর্টানা: দশমিকের যথার্থতা বেশি তবে পরিসর আরও কম। একটি ডাবল মান দশমিকের বাইরে সীমার বাইরে থাকতে পারে। : দেখুন stackoverflow.com/questions/7817866/...
Guffa

41

Mআক্ষরিক প্রত্যয় প্রয়োজন না করে আপনি এই জাতীয় দশমিক দ্বিগুণ করতে পারেন :

double dbl = 1.2345D;
decimal dec = (decimal) dbl;

Mএকটি নতুন আক্ষরিক দশমিক মান ঘোষণার সময় আপনার ব্যবহার করা উচিত :

decimal dec = 123.45M;

( M123.45 ব্যতীত ডাবল হিসাবে বিবেচিত হবে এবং এটি সংকলন করবে না))


28

ডিফল্ট রূপান্তর শ্রেণি ব্যবহার করুন: Convert.ToDecimal(Double)


4
না কারণ এটি একটি ওভারফ্লোএক্সেপশন ডাবল ভোল_ই = (ডাবল) দশমিক throw ছুঁড়ে ফেলবে ax ম্যাক্সভ্যালু + 10 ই + 28 ডি; কনসোল.ওরাইটলাইন ("কনভার্ট। টোডিসিমাল (ভোল_ই)) =" + রূপান্তর করুন। টোডিসিমাল (ভোল_ই));
টোকসিনে

4
@ টক্সিন আইএমএইচও বেশিরভাগ ক্ষেত্রে নিঃশব্দে ভুল ডেটা তৈরি করার চেয়ে একটি ওভারফ্লো এক্সপ্লেশন ভাল
নিজেই

16
Convert.ToDecimal(the double you are trying to convert);

4
আমি শিখেছি যে রূপান্তর শ্রেণি সি # তে থাকা কাস্টের চেয়ে অনেক বেশি নমনীয় এবং নিরাপদ।
টম

4
"নিরাপদ"? যেমন এটি কাস্ট করতে না পারলে এটি সংকলক ত্রুটির পরিবর্তে রান-টাইমে একটি ব্যতিক্রম ছুঁড়ে দেয়? আমি এতবার কামড়েছি যে সক্রিয়ভাবে রূপান্তর এড়াতে পেরেছি ...
পিটার রিচি

8
@ পিটাররিচি থ্রেডটি কিছুটা পুরানো তবে এটি বলা উচিত: রূপান্তর পদ্ধতির সরাসরি কল করা আরও উপযুক্ত পদ্ধতির হতে পারে। হতে পারে আমি কেবলমাত্র একটি অপ্টিমাইজেশন ফ্রিক কিন্তু সমাধানের জন্য আরও একটি কম নির্দেশ হ'ল বোনাস (যেহেতু স্পষ্ট (টাইপ) কাস্ট সিনট্যাক্সটি কেবলমাত্র একটি অপারেটর ওভারলোড যা কনভার্টকে কল করে)।
মাইক জনসন

4
@PeterRitchie: একটি ভাষা-নকশা দৃষ্টিকোণ থেকে, এটা ভাল বরং থেকে একটি typecast যার ফলে দুই রূপান্তর পদ্ধতি এক ব্যবহার করার জন্য একটি প্রোগ্রামার প্রয়োজন হতো doubleকরতে decimalদেওয়া যে একটি জন্য double(1000000.0 / 3.0) মত মান এক would কিছু ক্ষেত্রে "অতিরিক্ত" নির্ভুলতা 333333.33333333333D ফলন ক্লিপ করতে চান, তবে অন্য ক্ষেত্রে 333333.333333333313931D উপার্জন করে কেউ এটি ধরে রাখতে চান। কেবল "দশমিক রূপান্তরিত করুন" বলার পরিবর্তে কোডটিতে কীভাবে সেই রূপান্তরটি সম্পাদন করা উচিত তা নির্দিষ্ট করা উচিত।
সুপারক্যাট

4
@ সুপের্যাট যা আমার প্রথম মন্তব্যের সাথে সত্যই সম্পর্কযুক্ত বলে মনে হচ্ছে কারণ ব্যবহারটি হ'ল Convert.ToDecimal(double)একই রকম (decimal)doubleTotal, doubleTotalআপনি যদি একটি অন্য ধরণের পরিবর্তিত হয়ে থাকেন তবে আপনি সম্ভবত একটি সংকলন-সময় ত্রুটি এড়াতে এবং একটি হার্ড-টু- সন্ধানে রান-টাইম ত্রুটি পরিচয় করিয়ে দিতে পারেন কারণ একটি আলাদা টোডিসিমাল ওভাররাইড কল হতে পারে। কাস্ট অপারেটর আরও স্পষ্টত ...
পিটার রিচি

1

ভাল এটি একটি পুরানো প্রশ্ন এবং আমি এখানে দেখানো কিছু উত্তর ব্যবহার করেছি। তা সত্ত্বেও, আমার বিশেষ দৃশ্যকল্প ইন এটা সম্ভব ছিল doubleমান যে, আমি রূপান্তর চেয়েছিলেন decimalপ্রায়ই চেয়ে বড় ছিল decimal.MaxValue। সুতরাং, ব্যতিক্রমগুলি পরিচালনা করার পরিবর্তে আমি এই এক্সটেনশন পদ্ধতিটি লিখেছিলাম:

    public static decimal ToDecimal(this double @double) => 
        @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;

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


4
এটি নিম্নলিখিত ক্ষেত্রে ডাবল _ ডাবল = (ডাবল) দশমিক fail ব্যর্থ হবে ax ম্যাক্সভ্যালু; আমি তুলনামূলক ক্ষেত্রে सार्वजनिक ========================================= দশমিক.ম্যাক্সভ্যালু: (দশমিক) _ ডাবল;
মার্টিন ইলিজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.