পূর্ণসংখ্যা এবং দশমিক অংশগুলিতে একটি সংখ্যা বিভক্ত করা


91

সংখ্যাকে যেমন 1234.5678দুটি অংশে (1234, 0.5678)অর্থাৎ পূর্ণসংখ্যার অংশ এবং দশমিক অংশে বিভক্ত করার একটি অজগর উপায় আছে ?

উত্তর:


142

ব্যবহার math.modf:

import math
x = 1234.5678
math.modf(x) # (0.5678000000000338, 1234.0)

4
পারফেক্ট! নেতিবাচক সঙ্গে দুর্দান্ত কাজ! ধন্যবাদ
ডাবল এএ

4
math.modf প্রয়োগ করার পরে (এক্স) আমি ফলাফলের মানগুলি কীভাবে পরিচালনা করতে পারি? উদাহরণস্বরূপ যদি আমি কোনও ভেরিয়েবলকে 1234.0 প্রদান করি তবে আমি কীভাবে এটি করতে পারি?
হকিকো

4
ডেস্ক, ইনট = ম্যাথ.মডফ (1234.5678)
জিবিটিমন

17
intপরিবর্তনশীল নাম হিসাবে ব্যবহার করবেন না , এটি intফাংশনটিকে ওভাররাইড করবে ide
ফাঁকা

4
@ ট্রেনগোট - আপনার int_যদি এমন একটি পরিবর্তনশীল থাকতে হবে যা উচ্চস্বরে পড়লে "ইনট" বলা হয় Use
আর্টঅফ ওয়ারফেয়ার

61

আমরা একটি বিখ্যাত অন্তর্নির্মিত ফাংশন ব্যবহার করতে পারি; বিভাজন:

>>> s = 1234.5678
>>> i, d = divmod(s, 1)
>>> i
1234.0
>>> d
0.5678000000000338

4
Negative divmod(-4.5,1)ণাত্মক সংখ্যার জন্য সম্ভবত অপ্রচলিত ফলাফল দেয় : -5.0 এবং 0.5 দেয়। ব্যবহার divmod(-4.5, -1)করে 4.0 এবং -0.5 দেয়।
ফাঁকা

: @Holloway এটা unintuitive নয়, এটা গণিত নিয়ম থেকে আসে en.wikipedia.org/wiki/Floor_and_ceiling_functions :)
Sviatoslav ভি

43
>>> a = 147.234
>>> a % 1
0.23400000000000887
>>> a // 1
147.0
>>>

আপনি যদি পূর্ণসংখ্যার অংশটি একটি পূর্ণসংখ্যা হিসাবে চান এবং একটি ফ্লোট নয়, int(a//1)পরিবর্তে ব্যবহার করুন। একক উত্তরণে টিপলটি পেতে:(int(a//1), a%1)

সম্পাদনা: মনে রাখবেন যে একটি ফ্লোট সংখ্যার দশমিক অংশটি আনুমানিক , সুতরাং আপনি যদি এটি হিসাবে একটি মানব হিসাবে প্রতিনিধিত্ব করতে চান, আপনাকে দশমিক লাইব্রেরি ব্যবহার করতে হবে


4
নেতিবাচক সংখ্যার জন্য সামান্য বিভ্রান্তিকর ফলাফল -2.25 // 1 == -3.0এবং -2.25 % 1 == 0.75। এটি ওপি হতে পারে, যেমন int অংশ + দশমিক অংশটি এখনও মূল মানের সমান। বিপরীতে math.modf(-2.25) == (-0.25, -2.0),।
অ্যান্ড্রু ক্লার্ক

@ অ্যান্ড্রু - ভাল পয়েন্ট! আমি মনে করি @ মাইফ্রিটজের উত্তরটি আরও ভাল, যাইহোক!
ম্যাক

ভাল - আমি মনে করি এটি এখানে নেতিবাচক সংখ্যার জন্য অ্যান্ড্রু ক্লার্কের সতর্কতার কথা মনে রেখে দেখানো সবচেয়ে দ্রুততম উপায় হবে
জ্যাকানটারবারি

14
intpart,decimalpart = int(value),value-int(value)

ধনাত্মক সংখ্যার জন্য কাজ করে।


In [1]: value = 1.89 In [2]: intpart,decimalpart = int(value),value-int(value) In [3]: intpart Out [3]: 1 In [4]: decimalpart Out [4]: 0.8899999999999999
iMom0

4
@ আইমোম0 - ভাসমান পয়েন্টের নির্ভুলতা সম্পর্কিত এই সাইটটিতে ডকসস.ওরকল / সিডি / E19957-01/806-3568/ ncg_goldberg.html এবং অসংখ্য প্রশ্ন দেখুন ।
মার্ক রান্সম

7

এই রূপটি পছন্দসই নির্ভুলতা পেতে দেয়:

>>> a = 1234.5678
>>> (lambda x, y: (int(x), int(x*y) % y/y))(a, 1e0)
(1234, 0.0)
>>> (lambda x, y: (int(x), int(x*y) % y/y))(a, 1e1)
(1234, 0.5)
>>> (lambda x, y: (int(x), int(x*y) % y/y))(a, 1e15)
(1234, 0.5678)


0

এইভাবেই আমি এটি করি:

num = 123.456
split_num = str(num).split('.')
int_part = int(split_num[0])
decimal_part = int(split_num[1])

4
ব্যবহারের ক্ষেত্রে উপর নির্ভর করে, এটি সম্ভবত দশমিক স্থানের পরে শূন্যের সংখ্যার জন্য কাজ করবে না (উদাহরণস্বরূপ 123.0456)
জন

আপনি ঠিক বলেছেন: এটি ব্যবহারের ক্ষেত্রে নির্ভর করে। আপনি 123.0456 ফলাফলের সঙ্গে এটি চেষ্টা করুন int_part = 123 এবং decimal_part = 456. আমি দেখেছি "শূন্য অপসারণ" দরকারী :) আমার ব্যবহারের ক্ষেত্রে
holydrinker

0

আপনি যদি NumPy ব্যবহার করতে আপত্তি না করেন তবে:

In [319]: real = np.array([1234.5678])

In [327]: integ, deci = int(np.floor(real)), np.asscalar(real % 1)

In [328]: integ, deci
Out[328]: (1234, 0.5678000000000338)

0

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

i = int(x) # i contains a positive or negative integer
f = (x*1e17-i*1e17)/1e17 # f contains a positive or negative fraction

যেমন 100.1323-> 100, 0.1323এবং -100.1323->-100, -0.1323

পরীক্ষার স্ক্রিপ্ট:

#!/usr/bin/env python
import math
import cProfile

""" Get the performance of both statements vs math.modf. """

X = -100.1323
LOOPS = range(5*10**6)

def fun_a():
    """ The integer part (i) is an integer, and
        the fraction part (f) is a float.
        NOTE: I think this is the most correct way. """
    for _ in LOOPS:
        i = int(X) # -100
        f = (X*1e17-i*1e17)/1e17 # -0.1323

def fun_b():
    """ The integer (i) and fraction (f) part will
        come out as float.
        NOTE: The only difference between this
              and math.modf is the accuracy. """
    for _ in LOOPS:
        i = int(X) # -100
        i, f = float(i), (X*1e17-i*1e17)/1e17 # (-100.0, -0.1323)

def fun_c():
    """ Performance test of the statements in a function.
        The integer part (i) is an integer, and
        the fraction part (f) is a float. """
    def modf(x):
        i = int(x)
        return i, (x*1e17-i*1e17)/1e17

    for _ in LOOPS:
        i, f = modf(X) # (-100, -0.1323)

def fun_d():
    for _ in LOOPS:
        f, i = math.modf(X) # (-100.0, -0.13230000000000075)

def fun_e():
    """ Convert the integer part to integer. """
    for _ in LOOPS:
        f, i = math.modf(X) # (-100.0, -0.13230000000000075)
        i = int(i) # -100

if __name__ == '__main__':
    cProfile.run('fun_a()')
    cProfile.run('fun_b()')
    cProfile.run('fun_c()')
    cProfile.run('fun_d()')
    cProfile.run('fun_e()')

আউটপুট:

         4 function calls in 1.312 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.312    1.312 <string>:1(<module>)
        1    1.312    1.312    1.312    1.312 new1.py:10(fun_a)
        1    0.000    0.000    1.312    1.312 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         4 function calls in 1.887 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.887    1.887 <string>:1(<module>)
        1    1.887    1.887    1.887    1.887 new1.py:17(fun_b)
        1    0.000    0.000    1.887    1.887 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         5000004 function calls in 2.797 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.797    2.797 <string>:1(<module>)
        1    1.261    1.261    2.797    2.797 new1.py:23(fun_c)
  5000000    1.536    0.000    1.536    0.000 new1.py:27(modf)
        1    0.000    0.000    2.797    2.797 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         5000004 function calls in 1.852 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.852    1.852 <string>:1(<module>)
        1    1.050    1.050    1.852    1.852 new1.py:34(fun_d)
        1    0.000    0.000    1.852    1.852 {built-in method builtins.exec}
  5000000    0.802    0.000    0.802    0.000 {built-in method math.modf}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         5000004 function calls in 2.467 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.467    2.467 <string>:1(<module>)
        1    1.652    1.652    2.467    2.467 new1.py:38(fun_e)
        1    0.000    0.000    2.467    2.467 {built-in method builtins.exec}
  5000000    0.815    0.000    0.815    0.000 {built-in method math.modf}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

বিঃদ্রঃ:

বিবৃতিটি মডুলোর সাথে দ্রুততর হতে পারে, তবে সংখ্যার পূর্ণসংখ্যা এবং ভগ্নাংশের অংশগুলিতে বিভাজন করতে মডুলো ব্যবহার করা যাবে না।

i, f = int(x), x*1e17%1e17/1e17 # x can not be negative
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.