আমি কীভাবে জেএসপি / জাভাতে দ্বিগুণ থেকে পুরো এবং ভগ্নাংশ অংশ পেতে পারি?


104

আমি কীভাবে জেএসপি / জাভাতে দ্বিগুণ থেকে পুরো এবং ভগ্নাংশ অংশ পেতে পারি? যদি মানটি 3.25 হয় তবে আমি পেতে চাই fractional =.25,whole = 3

আমরা জাভাতে এটি কীভাবে করতে পারি?


4
আপনার মনে হয় ম্যান্টিসা এবং এক্সপোনেন্টটি কী তা সম্পর্কে একটি সঠিক ধারণা নেই। এগুলি কেবল "পুরো অংশ" এবং "ভগ্নাংশের অংশ" নয়। দেখুন en.wikipedia.org/wiki/Floating_point
জন স্কিট

আসলে আমি 'আরে .. যাওয়ার আগে তাকে' বলা হয় না 'এর আগে প্রায় 5 টি পোস্ট পড়েছি। আমার মস্তিষ্ক শব্দগুলি ছুঁড়ে ফেলেছে এবং সমস্যার সমাধান শুরু করেছে .. প্রোগ্রামিংয়ের জিনিসগুলি পড়ার খারাপ অভ্যাসগুলি আমাকে দিয়েছে :)
গিশু

1
এছাড়াও অন্যান্য কারণের জন্য উত্তর ও উত্তর প্রশ্নটি পুনরায় লিখুন।
গিশু

1
সন্দেহজনকভাবে হোমওয়ার্ক সমস্যার মতো মনে হচ্ছে।
ব্রায়ান নোব্লাচ

ওহ বুজছি. আমি ইতিমধ্যে ভেবেছিলাম কীভাবে তিনি এত অদ্ভুত ফলাফল পান
জোহানেস স্কাউব -

উত্তর:


102

http://www.java2s.com/Code/Java/Data-Type/Obtainingtheintegerandfractionalparts.htm

double num;
long iPart;
double fPart;

// Get user input
num = 2.3d;
iPart = (long) num;
fPart = num - iPart;
System.out.println("Integer part = " + iPart);
System.out.println("Fractional part = " + fPart);

আউটপুট:

Integer part = 2
Fractional part = 0.2999999999999998

61
আসলে এই পৃষ্ঠাটি "দ্বিগুণ জাভা থেকে ভগ্নাংশ এবং সম্পূর্ণ অংশ পান" =)
ক্রিস

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

2
সুতরাং প্রকৃতপক্ষে, এটি সঠিক নয়, আপনি আউটপুটে দেখতে পাচ্ছেন। ইনপুটটি 3 এর ভগ্নাংশ এবং আউটপুট 29999999 ... ডাবলের পরিবর্তে বিগডিসিমাল ব্যবহার করা কৌশলটি করবে যদিও
অ্যালেক্স

2
@ অ্যালেক্স না, ইনপুটটি এমন একটি সংখ্যা যা খুব কাছে 2.3, তবে অবশ্যই তা নয় 2.3। আপনি যদি 10 টির বেশি বৈধ সংখ্যা না চান তবে আউটপুট নিয়ে কোনও সমস্যা নেই। আপনার যা দরকার তা হ'ল প্রতিটি আউটপুটে (যেমন, ফর্ম্যাট %.9f) কিছুটা গোল হয় যা সাধারণত ব্যথার চেয়ে কম হয় BigDecimal। এখানে একমাত্র সমস্যা হ'ল উপচে পড়া।
মার্টিনাস

1
ডাবল ইন ইন রূপান্তর প্রায় সবসময় একটি খারাপ ধারণা। কারণ উদাহরণস্বরূপ (long)1.0e100আপনি ০ পাবেন you অনেক সময় আপনার দ্বিগুণ মূল্য প্রয়োজন কেবল "মেঝে" যার জন্য রয়েছে floor()। আপনি যদি উভয় ইন্টিগ্রাল এবং ভগ্নাংশ অংশ ব্যবহার করতে চান modf()। সত্যিই, এটি একটি খারাপ উত্তর।
মোজুবা

155
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;

12
কেন এই নিম্নমানের? দুর্দান্ত কাজ করে, এবং আমার সম্পাদনাটি নেতিবাচক মানগুলির সাথেও কাজ করবে।
এইচআরজে

পূর্ণসংখ্যার অংশটি => দীর্ঘ দীর্ঘপণ = (দীর্ঘ) 3.25
jdurango

2
নেং জন্য কাজ করবে না। মান। অর্থাৎ -3.25% 1 = 0.75 0.25 নয়। সুতরাং ইন্টিগ্রালপার্টটি -3.25 - 0.75 = -4 হবে।
উইন্ডাইডার

2
@ উইন্ড্রাইডার, আমি নেতিবাচক .. এবং এর কাজের জন্য যাচাই করেছি .. তবে দশমিক জায়গাগুলির জন্য যা সংখ্যায় ছোট, কিছুটা ত্রুটি হবে। যাত্রা। -03.0025 এর জন্য এটি ফিরে আসে -0.0024999999999999467 এবং -3.0
জাস্টশামস

5
এখানে বিভ্রান্তি হ'ল পাইথন জাতীয় কিছু ভাষা যেমন %মডুলো ( -3.25 % 1 == 0.75) এবং জাভা, ফোর্টরান, সি এবং সি ++ এর মতো অন্যান্য ভাষা ব্যবহার %করে, এর অর্থ বাকী অংশ ( -3.25 % 1 == -0.25) ব্যবহার করে । উইন্ড্রাইডার সম্ভবত এটি অযথার জন্য পাইথন আরপিএলে টাইপ করেছে, তবে এই উত্তরটি বিভ্রান্তিকর কারণ এই প্রশ্নটি জেভিএম সম্পর্কে।
জিম পিভারস্কি

24

যেহেতু 1 বছরের পুরানো এই প্রশ্নটি এমন কেউ দ্বারা লাথি মেরেছিল যিনি প্রশ্নের বিষয়টিকে সংশোধন করেছেন, এবং এই প্রশ্নটির সাথে ট্যাগ করা হয়েছে jsp , এবং এখানে কেউ জেএসপি লক্ষ্যবস্তু উত্তর দিতে সক্ষম হয় নি, এখানে আমার জেএসপি-লক্ষ্যযুক্ত অবদান রয়েছে।

ব্যবহারের JSTL (ঠিক ড্রপ jstl-1.2.jar মধ্যে /WEB-INF/lib) FMT taglib। একটা ব্যাপার <fmt:formatNumber>ট্যাগ অবলম্বন দিতে তুমি আসলে কি চান এবং সাহায্যে একটি বেশ সহজ পদ্ধতিতে maxFractionDigitsএবংmaxIntegerDigits বৈশিষ্ট্যের সাহায্যে।

এখানে একটি এসএসসিসিই রয়েছে , কেবল এটি অনুলিপি করুন।

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<%
    // Just for quick prototyping. Don't do this in real! Use servlet/javabean.
    double d = 3.25;
    request.setAttribute("d", d);
%>

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 343584</title>
    </head>
    <body>
        <p>Whole: <fmt:formatNumber value="${d}" maxFractionDigits="0" />
        <p>Fraction: <fmt:formatNumber value="${d}" maxIntegerDigits="0" />
    </body>
</html>

আউটপুট:

পুরো: 3

ভগ্নাংশ: .25

এটাই. কাঁচা জাভা কোডের সাহায্যে এটি ম্যাসেজ করার দরকার নেই।


8

আসল প্রশ্নটি ভগ্নাংশ এবং পুরো অংশের পরিবর্তে সূচক এবং ম্যান্টিসার জন্য জিজ্ঞাসা করেছিল।

দ্বিগুণ থেকে এক্সপেনেন্ট এবং ম্যান্টিসা পেতে আপনি এটিকে আইইইই 754 উপস্থাপনায় রূপান্তর করতে পারেন এবং এই জাতীয় বিটগুলি বের করতে পারেন:

long bits = Double.doubleToLongBits(3.25);

boolean isNegative = (bits & 0x8000000000000000L) != 0; 
long exponent      = (bits & 0x7ff0000000000000L) >> 52;
long mantissa      =  bits & 0x000fffffffffffffL;

মন্টিনেসার প্রথম বিটটি স্পষ্টভাবে 1 তে সেট করা নেই, তাই ম্যান্টিসারটি হওয়া উচিত (বিটস এবং 0x000fffffffffffL) | 0x0010000000000000L?
অগ্নুল

রাসমাস এটি একটি ছদ্মবেশী আউটপুট নষ্ট করেনি: সূচক 0 এবং ম্যান্টিসা 2814749767106560 এবং আপনি যদি উর্ননকে বেছে নেন তবে ম্যান্টিসা 0
বিনায়ক বেভিনাকাত্তি

4 টি ভোট দিয়ে ভাঙা :) যদিও আমি দেখতে পাচ্ছি যে কোডটি তার জয়েন্টগুলিতে ডাবল ভ্যালু আলাদা করে দেওয়ার চেষ্টা করছে তবে কোডটি সঠিক মানগুলি আউটপুট করে বলে মনে হচ্ছে না।
গিশু

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

5

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

double num, temp=0;
double frac,j=1;

num=1034.235;
// FOR THE FRACTION PART
do{
j=j*10;
temp= num*j;
}while((temp%10)!=0);       

j=j/10;
temp=(int)num;
frac=(num*j)-(temp*j);

System.out.println("Double number= "+num);      
System.out.println("Whole part= "+(int)num+" fraction part= "+(int)frac);

বাবু, এটি একটি সাধারণ সমস্যার জন্য অত্যন্ত জটিল উত্তর। আপনি কি গ্রহণযোগ্য উত্তরটি একবার দেখেছেন?
ধূসর

1
এখন যে ব্যক্তি ডাউন-ভোট করেছে (আমার বিটিডব্লিউ নয়), কেন ডাউন-ভোট ছিল তা ব্যাখ্যা করা উচিত । এটা ভালো না. তবে আমাদের সকলের কোনও না কোনও সময় অন্য স্কোর ছিল।
ধূসর

2
@ গ্রে প্রশ্নটি 3.25 কে '3' এবং '25' হিসাবে আলাদা করার ছিল এবং স্বীকৃত উত্তর কখনও '25' দেয় না, এটি সর্বদা '2599999999' দেবে
ওয়ানপঞ্চমান

@ গ্রে আমি জানি এটি কে কমেছে, এটি এই লোকের নাম ইজি (পুরাতন ব্যবহারকারী) আমার ব্লগে পোস্ট করা প্রতিটি মন্তব্য, উত্তর এবং প্রশ্নগুলির প্রত্যেকটি নিয়ে ঠাট্টা-বিদ্রূপ করছে। অবশেষে আমি মডারেটরের কাছে অভিযোগ করছি।
ওয়ানপঞ্চম্যান

2
আপনি যদি পূর্ণসংখ্যার হিসাবে ভগ্নাংশের অংশটি চান তবে এই অ্যানোভারটি খুব কার্যকর
গিলহার্ম ক্যাম্পোস হাজান

5

আইএনইই ডাবল ভাসমান পয়েন্ট সংখ্যার মান্টিসা এবং এক্সপোজনটি এমন মান

value = sign * (1 + mantissa) * pow(2, exponent)

মান্টিসা যদি 0.101010101_base 2 ফর্মের হয় (যেমন এর সর্বাধিক তাত্পর্যপূর্ণ বিটটি বাইনারি পয়েন্টের পরে স্থানান্তরিত হয়) এবং ঘর্ষণটি পক্ষপাতের জন্য সামঞ্জস্য করা হয়।

১.6 থেকে, জাভা.লং.ম্যাথ পক্ষপাতহীন ঘাঁটিঘাঁটি পেতে (গেটএক্সপোনেন্ট (ডাবল) বলা হয়) পাওয়ার জন্য একটি সরাসরি পদ্ধতিও সরবরাহ করে

তবে, আপনি যে নম্বরগুলির জন্য জিজ্ঞাসা করছেন সেগুলি হ'ল সংখ্যার অবিচ্ছেদ্য এবং ভগ্নাংশের অংশ, যা ব্যবহার করে প্রাপ্ত হতে পারে

integral = Math.floor(x)
fractional = x - Math.floor(x)

যদিও আপনি নেতিবাচক সংখ্যার সাথে অন্যরকম আচরণ করতে চান (floor(-3.5) == -4.0) দুটি অংশ চান তা নির্ভর করে আপনি করতে চান।

আমি দৃ strongly়ভাবে পরামর্শ দিচ্ছি যে আপনি এই ম্যান্টিসাকে এবং বেদীটিকে কল করবেন না।


4

এটি দ্রুত কিনা জানি না তবে আমি ব্যবহার করছি

float fp = ip % 1.0f;

3

[সম্পাদনা করুন: মূলত প্রশ্নটি জিজ্ঞাসা করেছিল যে কীভাবে ম্যান্টিসা এবং কাফের পেতে হবে]]

আসল মান্টিসা / এক্সপোনেন্ট পাওয়ার জন্য যেখানে এন

exponent = int(log(n))
mantissa = n / 10^exponent

অথবা, আপনি যে উত্তরটি খুঁজছিলেন তা পেতে:

exponent = int(n)
mantissa = n - exponent

এগুলি ঠিক জাভা নয় তবে রূপান্তর করা সহজ হওয়া উচিত।


3

পূর্ণসংখ্যার অংশটি সাধারণ ingালাই থেকে এবং ভগ্নাংশের জন্য - স্ট্রিং বিভাজন:

double value = 123.004567890

int integerPart = (int) value; // 123

int fractionPart = 
  Integer.valueOf(String.valueOf(value)
      .split(".")[1]); // 004567890

/**
* To control zeroes omitted from start after parsing.
*/
int decimals =
  String.valueOf(value)
      .split(".")[1].length(); // 9

1

আপনার নম্বরটি 2.39999999999999 হলে কী হবে। আমি মনে করি আপনি সঠিক দশমিক মান পেতে চান। তারপরে বিগডিসিমাল ব্যবহার করুন:

Integer x,y,intPart;
BigDecimal bd,bdInt,bdDec;
bd = new BigDecimal("2.39999999999999");
intPart = bd.intValue();
bdInt = new BigDecimal(intPart);
bdDec = bd.subtract(bdInt);
System.out.println("Number : " + bd);
System.out.println("Whole number part : " + bdInt);
System.out.println("Decimal number part : " + bdDec);

0

যেহেতু fmt:formatNumberট্যাগটি সর্বদা সঠিক ফল দেয় না, তাই এখানে আরেকটি জেএসপি-কেবল পদ্ধতির উপস্থিতি রয়েছে: এটি কেবল সংখ্যাকে স্ট্রিং হিসাবে ফর্ম্যাট করে এবং স্ট্রিংয়ের বাকী গণনা করে, কারণ এটি সহজ এবং আরও ভাসমান পয়েন্ট জড়িত না arithmetics।

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<%
  double[] numbers = { 0.0, 3.25, 3.75, 3.5, 2.5, -1.5, -2.5 };
  pageContext.setAttribute("numbers", numbers);
%>

<html>
  <body>
    <ul>
      <c:forEach var="n" items="${numbers}">
        <li>${n} = ${fn:substringBefore(n, ".")} + ${n - fn:substringBefore(n, ".")}</li>
      </c:forEach>
    </ul>
  </body>
</html>

আমার উদাহরণ থেকে সমস্ত সংখ্যা চেষ্টা করুন। fmt:formatNumberতার যুক্তি গোল করে, যা এই ক্ষেত্রে চাওয়া হয় না।
রোল্যান্ড ইলিগ

0

এই উত্তরগুলির অনেকটিতে ভয়াবহ গোলাকৃতি ত্রুটি রয়েছে কারণ তারা এক ধরণের থেকে অন্য প্রকারে নম্বর কাস্ট করছে। কেমন:

double x=123.456;
double fractionalPart = x-Math.floor(x);
double wholePart = Math.floor(x);

ব্যবহার সম্পর্কে কি Math.abs?
স্টিফান

0

গৃহীত উত্তর -0 এবং -1.0 এর মধ্যে নেতিবাচক সংখ্যার জন্য ভাল কাজ করে না এছাড়াও ভগ্নাংশের অংশটিকে নেতিবাচকও দেয়।

উদাহরণস্বরূপ: -0,35 নম্বরের জন্য

আয়

পূর্ণসংখ্যা অংশ = 0 ভগ্নাংশ অংশ = -0.35

যদি আপনি জিপিএস সমন্বয় নিয়ে কাজ করে থাকেন তবে পূর্ণসংখ্যার অংশে সাইনামের ফলস্বরূপ ফলাফল পাওয়া ভাল:

পূর্ণসংখ্যা অংশ = -0 ভগ্নাংশ অংশ = 0.35

থিস নম্বরগুলি জিপিএস স্থানাঙ্কের জন্য উদাহরণস্বরূপ ব্যবহৃত হয়, যেখানে ল্যাট বা লং পজিশনের জন্য গুরুত্বপূর্ণ সাইনাম

কোড প্রস্তাব করুন:

    double num;
    double iPart;
    double fPart;

    // Get user input
    num = -0.35d;
    iPart = (long) num;
    //Correct numbers between -0.0 and -1.0
    iPart = (num<=-0.0000001 && num>-1.0)? -iPart : iPart ;
    fPart = Math.abs(num - iPart);
    System.out.println(String.format("Integer part = %01.0f",iPart));
    System.out.println(String.format("Fractional part = %01.04f",fPart));

আউটপুট:

Integer part = -0
Fractional part = 0,3500

0

জাভা 8, যেহেতু আপনি ব্যবহার করতে পারেন Math.floorDiv

এটি বৃহত্তম (ইতিবাচক অনন্তের নিকটতম) ফেরত দেয় int মানটি প্রদান করে যা বীজগণিত ভাগফলের চেয়ে কম বা সমান।

কিছু উদাহরণ:

floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2

বিকল্পভাবে, /অপারেটরটি ব্যবহার করা যেতে পারে:

(4 / 3) == 1
(-4 / 3) == -1

তথ্যসূত্র:


0

আমি বিগডিসিমালটি সমাধানের জন্য ব্যবহার করব। এটার মত:

    double value = 3.25;
    BigDecimal wholeValue = BigDecimal.valueOf(value).setScale(0, BigDecimal.ROUND_DOWN);
    double fractionalValue = value - wholeValue.doubleValue();

0
String value = "3.06";

if(!value.isEmpty()){
    if(value.contains(".")){    
        String block = value.substring(0,value.indexOf("."));
        System.out.println(block);
    }else{
        System.out.println(value);
    }
}

এই উত্তরটি নিম্নমানের হিসাবে চিহ্নিত করা হয়েছে। যদি এটি প্রশ্নের উত্তর দেয়, এটি কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য কিছুটা পাঠ্য যোগ করার বিষয়টি বিবেচনা করুন।
lmo

0
// target float point number
double d = 3.025;

// transfer the number to string
DecimalFormat df = new DecimalFormat();
df.setDecimalSeparatorAlwaysShown(false);
String format = df.format(d);

// split the number into two fragments
int dotIndex = format.indexOf(".");
int iPart = Integer.parseInt(format.substring(0, dotIndex)); // output: 3
double fPart = Double.parseDouble(format.substring(dotIndex)); // output: 0.025

0

ঠিক আছে এটি হতে পারে দেরী, তবে আমি মনে করি সেরা এবং আরও সঠিক পদ্ধতির বিগডিসিমাল ব্যবহার করা হচ্ছে

double d = 11.38;

BigDecimal bigD = BigDecimal.valueOf(d);
int intPart = bigD.intValue();
double fractionalPart = bigD.subtract(BigDecimal.valueOf(intPart)).doubleValue();

System.out.println(intPart); // 11
System.out.println(fractionalPart ); //0.38

আপনার যদি একটি ডাবল থাকে তবে এটিতে ভাসমান অসম্পূর্ণতা রয়েছে। এটিকে একটি বিগডিসিমালে রূপান্তর করা যাদুতে এটির যথার্থতা পুনরুদ্ধার করবে না।
তাসচি

@ তাসছি আমার মনে হয় প্রশ্নটি ইন্ট এবং ভগ্নাংশের অংশকে আলাদা করার বিষয়ে, তার যথার্থতা পুনরুদ্ধার করার জন্য নয়!
ওমর এল্যাশ্রি

ওমর, আপনি আপনার দৃষ্টিভঙ্গি "আরও সঠিক" হওয়ার বিষয়ে বিশেষভাবে কথা বলেছেন, যা আমি মনে করি ঠিক সত্য নয়। আপনার উত্তর সম্পূর্ণরূপে গ্রহণযোগ্য তবে শব্দবন্ধটি আমার কাছে বিভ্রান্তিকর বলে মনে হচ্ছে, এজন্য আমি এটিতে মন্তব্য করেছি।
তাসচি

@ তাসচি, আমি বলেছি যে অনেক আউটপুট যখন আপনি আউটপুট পাবেন তখন আপনি মূল্য হারাবেন, উদাহরণস্বরূপ input (5.03) output int = 5 , fractional = 0.0299999, আমরা ইনপুট এবং আউটপুট সম্পর্কে কথা বলছি, আপনি মূল্য রাখবেন এবং এর মান 0.001% না হারিয়ে ফিরে পাবেন! এবং এটি সঠিক, বিভ্রান্তিকর নয়!
ওমর এলশ্রি

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

-2
public class MyMain2 {
    public static void main(String[] args) {
        double myDub;
        myDub=1234.5678;
        long myLong;
        myLong=(int)myDub;
        myDub=(myDub%1)*10000;
        int myInt=(int)myDub;
        System.out.println(myLong + "\n" + myInt);
    }
}

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