আমি কীভাবে বিভাগকে ভাসমান পয়েন্ট হতে বাধ্য করতে পারি? বিভাগ 0 এর নিচে গোল হয়?


721

আমার দুটি পূর্ণসংখ্যার মান রয়েছে aএবং bতবে আমার ভাসমান পয়েন্টে তাদের অনুপাতের প্রয়োজন। আমি এটি জানি a < bএবং আমি গণনা করতে চাই a / b, সুতরাং আমি যদি পূর্ণসংখ্যা বিভাগটি ব্যবহার করি তবে আমি সর্বদা 0 এর বাকী অংশ সহ 0 পেতাম a

cনীচের পাইথনে আমি কীভাবে একটি ভাসমান পয়েন্ট নম্বর হতে বাধ্য করতে পারি ?

c = a / b

মাত্র পাইথন 3 এ আপগ্রেড করুন
বোরিস

উত্তর:


807

পাইথন 2 এ, দুটি ইন্টির বিভাজন একটি ইনট উত্পাদন করে। পাইথন 3 এ এটি ভাসমান উত্পাদন করে। আমদানি করে আমরা নতুন আচরণটি পেতে পারি __future__

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

13
নোট করুন যে from __future__ import divisionফাইলটির একেবারে শুরুতে হওয়া উচিত
ইয়ানিস

এছাড়াও সমস্যাটি হ'ল যদি আপনি এক জায়গায় পূর্ণসংখ্যা বিভাগটি চান তবে ফাইলের অন্য জায়গায় ফ্লোট বিভাগ ...
পারদারি0114

1
@ মার্কারি0114: সমস্যা নয়; আপনি কেবল //যখন মেঝে বিভাগ চান এবং /যখন আপনি "সত্য" ( float) বিভাগ চান তখন ব্যবহার করুন ।
শ্যাডোর্যাঞ্জার

715

আপনি করে ভাসতে কাস্ট করতে পারেন c = a / float(b)। অঙ্ক বা ডিনোমিনেটরটি যদি ভাসমান হয় তবে ফলাফলটিও হবে।


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


195

আমি কীভাবে বিভাগকে পাইথনে ভাসমান বিন্দুতে বাধ্য করতে পারি?

আমার দুটি এবং পূর্ণসংখ্যার দুটি মান রয়েছে তবে আমার ভাসমান পয়েন্টে তাদের অনুপাতের প্রয়োজন। আমি জানি যে একটি <b এবং আমি a / b গণনা করতে চাই, সুতরাং আমি যদি পূর্ণসংখ্যা বিভাগটি ব্যবহার করি তবে আমি সর্বদা একটি এর বাকী অংশ দিয়ে 0 পাই।

নীচের পাইথনে সিটিকে কীভাবে একটি ভাসমান পয়েন্ট নম্বর হিসাবে বাধ্য করতে পারি?

c = a / b

এখানে আসলে যা জিজ্ঞাসা করা হচ্ছে তা হ'ল:

"আমি কীভাবে সত্য বিভাগকে জোর a / bকরব যে ভগ্নাংশ ফিরে আসবে?"

পাইথন 3 এ আপগ্রেড করুন

পাইথন 3 এ, সত্য বিভাগ পেতে, আপনি কেবল করেন a / b

>>> 1/2
0.5

মেঝে বিভাগ, পূর্ণসংখ্যার জন্য ক্লাসিক বিভাগের আচরণ এখন a // b:

>>> 1//2
0
>>> 1//2.0
0.0

তবে, আপনি পাইথন 2 ব্যবহার করে আটকে থাকতে পারেন, বা আপনি কোড লিখতে পারেন যা অবশ্যই 2 এবং 3 উভয় ক্ষেত্রেই কাজ করবে।

পাইথন 2 ব্যবহার করা হলে

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

পাইথন 2 এর জন্য সুপারিশ

আপনি নীচে নীচে আমদানি সহ যে কোনও প্রদত্ত মডিউলে পাইথন 3 বিভাগের আচরণ পেতে পারেন:

from __future__ import division

যা পুরো মডিউলে পাইথন 3 স্টাইল বিভাগ প্রয়োগ করে। এটি কোনও নির্দিষ্ট সময়ে পাইথন শেলটিতেও কাজ করে। পাইথন 2 এ:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

এটি সত্যই সেরা সমাধান কারণ এটি নিশ্চিত করে যে আপনার মডিউলে কোডটি পাইথন 3 এর সাথে আরও সামঞ্জস্যপূর্ণ।

পাইথন 2 এর জন্য অন্যান্য বিকল্প

আপনি যদি এটি পুরো মডিউলে প্রয়োগ করতে না চান তবে আপনি কয়েকটি কাজের ক্ষেত্রের মধ্যে সীমাবদ্ধ। সর্বাধিক জনপ্রিয় হ'ল অপারেটরগুলির মধ্যে একটিকে ভাসাতে বাধ্য করা। একটি শক্ত সমাধান a / (b * 1.0)। একটি তাজা পাইথন শেল এ:

>>> 1/(2 * 1.0)
0.5

মজবুত truedivথেকেও দৃust operatoroperator.truediv(a, b), তবে এটি সম্ভবত ধীর কারণ এটি একটি ফাংশন কল:

>>> from operator import truediv
>>> truediv(1, 2)
0.5

পাইথন 2 এর জন্য প্রস্তাবিত নয়

সাধারণভাবে দেখা হয় a / float(b)। এটি একটি টাইপরর উত্থাপন করবে যদি বি জটিল সংখ্যা হয়। জটিল সংখ্যার বিভাজন যেহেতু সংজ্ঞায়িত করা হয়েছে, তাই বিভাজকের জন্য একটি জটিল সংখ্যা পাস করার সময় বিভাগটি ব্যর্থ না হওয়ার বিষয়টি আমার কাছে বোধগম্য।

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

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

আপনি -Qnewপতাকাটি দিয়ে পাইথনও চালাতে পারেন , তবে এটিতে নতুন পাইথন 3 আচরণের মাধ্যমে সমস্ত মডিউলগুলি কার্যকর করার ক্ষয়ক্ষতি রয়েছে এবং আপনার কিছু মডিউল ক্লাসিক বিভাগের আশা করতে পারে, তাই আমি পরীক্ষা ছাড়া এটি সুপারিশ করি না। তবে প্রদর্শন করতে:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j

3
"1 // 2 = 0", "1 // 2.0 = 0.0" - আকর্ষণীয় ছোট্ট গোচা, এটি একটি পূর্ণসংখ্যা বিভাগ এমনকি যদি অপারেন্ডগুলির কোনও ভাসমান হয় তবে ফলাফলটি একটি সম্পূর্ণ সংখ্যা তবে ভাসমান। আমি তালিকা সূচক গণনা করতে একটি পূর্ণসংখ্যা বিভাগ ব্যবহার করছিলাম এবং এর কারণে একটি ত্রুটি পেয়েছি।
আর নভেগা


66

পাইথন ৩.x এ, একক স্ল্যাশ ( /) সর্বদা সত্য (অ-ছাড়াই) বিভাজন বোঝায়। ( //অপারেটরটি কাটা বিভাগের জন্য ব্যবহৃত হয়)) পাইথন ২.x (২.২ এবং তারপরে) তে, আপনি একটি একই আচরণ রেখে এই একই আচরণ পেতে পারেন

from __future__ import division

আপনার মডিউল শীর্ষে।


30

ভাসমান-পয়েন্ট বিন্যাসে বিভাগের জন্য যে কোনও প্যারামিটার তৈরি করাও ভাসমান-পয়েন্টে আউটপুট তৈরি করে।

উদাহরণ:

>>> 4.0/3
1.3333333333333333

বা,

>>> 4 / 3.0
1.3333333333333333

বা,

>>> 4 / float(3)
1.3333333333333333

বা,

>>> float(4) / 3
1.3333333333333333

4
তবে আপনাকে পরে করতে প্ররোচিত হতে পারে 1.0 + 1/3বা float(c) + a/bবা float(a/b)এবং আপনি উত্তরটি নিয়ে হতাশ হবেন। __future__.divisionআপনার প্রত্যাশার উত্তরটি সর্বদা পাওয়ার জন্য পাইথন 3+ ব্যবহার করা বা মডিউলটি আমদানি করা (গ্রহণযোগ্য উত্তর দেখুন) ভাল। বিদ্যমান বিভাগের নিয়মগুলি কুখ্যাত, হার্ড-টু-ট্রেস গণিত ত্রুটি তৈরি করে।
hobs

@ জোকন্ড্রন আপনি কি চেষ্টা করেছেন python -c 'a=10; b=3.0; print a/b'?
gsbabil

আমার দরকার নেই কারণ এটি অবশ্যই এই দৃশ্যে কাজ করে। তবে, যদি aএবং 'বি', উদাহরণস্বরূপ, একটি পূর্ণসংখ্যা-মান ফাংশনের আউটপুটগুলি কী হয়? যেমন a = len(list1), b = len(list2),।
জোকন্ড্রন

@ জোকনড্রন: ভালো কথা। আমি স্রেফ উত্তরটি আপডেট করেছি float(..)। আমি মনে করি 1.0যে নীচে প্রস্তাবিত @ পিনোচলে এর দ্বারা গুণ করাও কার্যকর হতে পারে।
gsbabil

21

.ভাসমান পয়েন্ট সংখ্যা নির্দেশ করতে একটি বিন্দু ( ) যুক্ত করুন

>>> 4/3.
1.3333333333333333

2
অঙ্ক এবং ডিনোমিনেটর উভয় ভেরিয়েবল হলে আপনি কীভাবে এই পদ্ধতির প্রয়োগ করতে চলেছেন?
stackoverflowuser2010

আমি ধরে নিলাম আপনি প্রথম উদাহরণটি উল্লেখ করেছেন, যদি তা হয় তবে আমি কেবল float()একটি ভেরিয়েবল ব্যবহার করব।
আলেকজান্ডার

13

এটিও কাজ করবে

>>> u=1./5
>>> print u
0.2

4
এবং যদি আপনি এই পদ্ধতির প্রয়োগ করতে চলেছেন তবে যদি অঙ্ক এবং ডিনোমিনেটর উভয়ই ভেরিয়েবল হয়?
stackoverflowuser2010

1
কারণ ভেরিয়েবলগুলি বিমূর্ত করার জন্য ব্যবহার করা হলে এটি কাজ করে না। প্রায় কোনও অর্থবহ কোডের মতো হার্ডকোডের মান নেই।
কেয়ার সিমন্স

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

দীর্ঘ সময়ের জন্য, আমি আসলে ভেবেছিলাম ./পাইথনে একটি বৈধ অপারেটর যা আপনাকে ভাসমান পয়েন্ট বিভাগ করতে দেয়। এই কারণেই কোনও প্রোগ্রামিং ভাষায় সাদা স্থানটি ন্যায়বিচারের সাথে ব্যবহার করা ভাল
smac89

6

আপনি যদি ডিফল্টরূপে "সত্য" (ভাসমান পয়েন্ট) বিভাগটি ব্যবহার করতে চান তবে একটি কমান্ড লাইন পতাকা রয়েছে:

python -Q new foo.py

কিছু ত্রুটি রয়েছে (পিইপি থেকে):

এটি যুক্তিযুক্ত যে ডিফল্ট পরিবর্তন করার জন্য একটি কমান্ড লাইন বিকল্পটি খারাপ। এটি অবশ্যই ভুল হাতে বিপজ্জনক হতে পারে: উদাহরণস্বরূপ, একটি তৃতীয় পক্ষের লাইব্রেরি প্যাকেজটি একত্রিত করা অসম্ভব যেটি-কুল প্রয়োজন অন্য একটির সাথে জেনে রাখা দরকার।

পাইথন ম্যান পৃষ্ঠাটি দেখে বিভাগের আচরণ সম্পর্কে পরিবর্তন / সতর্কতা-সংক্রান্ত অন্যান্য পতাকাগুলির মূল্য সম্পর্কে আপনি আরও শিখতে পারেন।

বিভাগ পরিবর্তনগুলি সম্পর্কে সম্পূর্ণ বিশদের জন্য পড়ুন: পিইপি 238 - বিভাগ অপারেটর পরিবর্তন করা


2
from operator import truediv

c = truediv(a, b)

2
যদিও এটি আদর্শ নয়, যেহেতু এটি এমন কোনও ক্ষেত্রে কাজ করে না যেখানে aকোনও ইন্টি এবং bফ্লোট। একই লাইন বরাবর একটি আরও ভাল সমাধান করানো from operator import truedivএবং তারপরে ব্যবহার করা truediv(a, b)
মার্ক ডিকিনসন

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

1
from operator import truediv

c = truediv(a, b)

যেখানে a হ'ল লভ্যাংশ এবং বি বিভাজক। দুটি পূর্ণসংখ্যার বিভাজনের পরে ভাগফল একটি ভাসা হলে এই ফাংশনটি কার্যকর হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.