JSP / Java의 double에서 전체 및 부분 부분을 어떻게 얻습니까?


104

JSP / Java의 double에서 전체 및 부분 부분을 어떻게 얻습니까? 값이 3.25이면을 얻고 싶습니다 fractional =.25.whole = 3

Java에서 어떻게 할 수 있습니까?


4
가수와 지수가 무엇인지 부정확 한 생각이있는 것 같습니다. 그것들은 단지 "전체 부분"과 "분수 부분"이 아닙니다. en.wikipedia.org/wiki/Floating_point
Jon Skeet

사실 '지 .. 그건 지수라고 부르지 않아'가기 전에 글을 5 개 정도 읽었어요. 내 두뇌는 단어를 버리고 문제를 해결하기 시작했습니다. .. 프로그래밍 물건을 읽는 나쁜 습관이 나에게 준 것입니다 :)
Gishu

1
또한 다른 이유 중에서도 후세를 위해 질문 OP ..를 다시 표현하십시오.
Gishu

1
숙제 문제처럼 의심스럽게 들립니다.
Brian Knoblauch

오, 알겠습니다. 나는 그가 어떻게 그렇게 이상한 결과를 얻는 지 이미 궁금했다
Johannes Schaub-litb 2008-12-05

답변:


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
실제로이 페이지는 "더블 자바에서 분수와 전체 부분을 가져 오기"에 대한 Google 검색의 첫 번째 히트입니다. =)
Chris

12
실제로이 대답은 올바르지 않습니다. long보다 큰 값은 분수 부분에서 큰 숫자를 나타낼 수 있기 때문입니다. 아래의 Dan Vinton 답변은 간단하며 항상 올바른 결과를 반환합니다.
arberg

2
출력에서 볼 수 있듯이 실제로 이것은 올바르지 않습니다. 입력은 3의 분수이고 출력은 29999999입니다. Double 대신 BigDecimal을 사용하면 트릭을 수행 할 수 있습니다
Alex

2
@Alex 아니요, 입력은에 매우 가까운 숫자 2.3이지만 확실히 아닙니다 2.3. 그리고 10 개 이상의 유효한 숫자를 원하지 않는 한 출력에 문제가 없습니다. 필요한 것은 각 출력 (예 : format %.9f) 에서 반올림 하는 것 뿐이며 일반적으로 BigDecimal. 여기서 유일한 문제는 오버플로입니다.
maaartinus 2015-06-04

1
double을 int로 변환하는 것은 거의 항상 나쁜 생각입니다. 예를 들어 (long)1.0e1000을 얻을 수 있기 때문입니다 floor(). 많은 경우 단순히 "floored"가있는 double 값이 필요합니다 . 정수 부분과 분수 부분을 모두 사용하려면 modf(). 정말로 이것은 잘못된 대답입니다.
mojuba

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

12
왜 이것이 반대 투표입니까? 잘 작동하며 내 편집으로 음수 값으로도 작동합니다.
HRJ

정수 부분은 => long longPart = (long) 3.25
jdurango

2
부정을 위해 작동하지 않습니다. 가치. 즉 -3.25 % 1 = 0.75가 아닌 0.25. 따라서 integratedPart는 -3.25-0.75 = -4가됩니다.
WindRider 2014

2
@WindRider, 나는 음수 ..와 그 작동을 확인했다. 그러나 숫자가 작은 소수 자리는 약간의 오류가있을 것이다. 전의. -03.0025 것이 -0.0024999999999999467와 -3.0 반환
justshams

5
여기서 혼란은 Python과 같은 일부 언어 %는 모듈로 ( -3.25 % 1 == 0.75) 를 의미 하고 Java, Fortran, C 및 C ++와 같은 다른 언어 %는 나머지 ( -3.25 % 1 == -0.25) 를 의미하기 때문 입니다. WindRider는 편의를 위해 Python REPL에 입력했을 수 있지만이 질문은 JVM에 관한 것이기 때문에 그 대답은 잘못된 것입니다.
Jim Pivarski 2015 년

24

이 1 년 된 질문은 질문 주제를 수정 한 사람에 의해 시작되었고이 질문에으로 태그가 지정 jsp되었고 여기에 아무도 JSP 대상 답변을 제공 할 수 없었 으므로 여기에 JSP 대상 기여가 있습니다.

JSTL을 사용하십시오 ( jstl-1.2.jar/WEB-INF/lib) fmt taglib. <fmt:formatNumber>당신이 원하는 것을 정확히 maxFractionDigits하고 maxIntegerDigits속성의 도움으로 아주 쉬운 방식으로 하는 태그 가 있습니다 .

여기에 SSCCE가 있습니다. copy'n'paste'n'run 입니다.

<%@ 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

그게 다야. 원시 Java 코드를 사용하여 마사지 할 필요가 없습니다.


8

원래 질문은 분수와 전체 부분이 아닌 지수와 가수를 요구했습니다.

double에서 지수와 가수를 얻으려면 IEEE 754 표현 으로 변환하고 다음 과 같이 비트를 추출 할 수 있습니다 .

long bits = Double.doubleToLongBits(3.25);

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

mantinssa의 첫 번째 비트가 암시 적으로 1로 설정되어 있지 않으므로 가수는 (비트 & 0x000fffffffffffffL) | 0x0010000000000000L?
agnul

Rasmus it wasnt a ryt output Output : exponent 0 and mantissa 2814749767106560 and if u choose urs agnul the mantissa is 0
Vinayak Bevinakatti

4 개의 찬성표로 깨짐 :) 코드가 조인트에서 이중 값을 분리하여 수행하려는 작업을 알지만 코드가 올바른 값을 출력하지 않는 것 같습니다.
Gishu

@agnul : "mantissa"는 보통 비트의 값만을 의미한다고 생각합니다. 1 비트를 앞에 추가하여 (때로는) significand로 변환 할 수 있습니다. 그러나 Wikipedia에 따르면 가수라는 단어는 이제 "분수"를 위해 더 이상 사용되지 않습니다.
Rasmus Faber

5

주 논리는 먼저 소수점 뒤에 몇 자리가 있는지 찾아야합니다.
이 코드는 최대 16 자리 숫자에 대해 작동합니다. BigDecimal을 사용하는 경우 최대 18 자리까지만 실행할 수 있습니다. 입력 값 (귀하의 숫자)을 변수 "num"에 넣으십시오. 여기에 예를 들어 하드 코딩했습니다.

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);

야, 이것은 간단한 문제에 대한 매우 복잡한 대답입니다. 수락 된 답변을 살펴 보셨습니까?
Gray

1
이제 다운 투표를 한 사람 (나가 아님)이 설명 했어야합니다. 반대표가 있었 는지 했습니다. 그 좋지 않다. 그러나 우리 모두는 어느 시점에서 1 점을 받았습니다.
Gray

2
@Gray 질문은 3.25를 '3'과 '25'로 분리하는 것이었고, 수락 된 답변은 절대 '25'를 제공하지 않으며 항상 '2599999999'를 제공합니다
OnePunchMan

@Gray 나는 그것을 누가 비판했는지 알고 있습니다.이 블로그에 게시하는 모든 댓글, 답변 및 질문을 조롱하는 Eji (이전 사용자)라는 남자 이름이었습니다. 마침내 나는 사회자에게 불평합니다.
OnePunchMan

2
이 anwer는 분수 부분을 정수로 원하는 경우 매우 유용합니다.
Guilherme Campos Hazan

5

IEEE 이중 부동 소수점 숫자의 가수와 지수는 다음과 같은 값입니다.

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

가수가 0.101010101_base 2 형식이고 (즉, 가장 중요한 비트가 이진 점 이후로 이동 됨) 지수가 바이어스에 맞게 조정 된 경우.

1.6 이후, java.lang.Math는 편향되지 않은 지수 (getExponent (double)라고 함)를 얻는 직접적인 방법도 제공합니다.

그러나 당신이 요구하는 숫자는 숫자의 정수 부분과 분수 부분이며, 다음을 사용하여 얻을 수 있습니다.

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

(floor(-3.5) == -4.0)두 부분을 원하는 이유에 따라 음수를 다르게 처리하고 싶을 수도 있습니다 .

이 가수와 지수를 부르지 말 것을 강력히 제안합니다.


4

이것이 더 빠른지 모르겠지만 사용하고 있습니다.

float fp = ip % 1.0f;

3

[편집 : 원래 가수와 지수를 구하는 방법을 묻는 질문입니다.]

여기서 n 은 실제 가수 / 지수를 구하기위한 숫자입니다.

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

또는 찾고 있던 답을 얻으려면 :

exponent = int(n)
mantissa = n - exponent

정확히 Java는 아니지만 변환하기 쉽습니다.


3

정수 부분은 단순 캐스팅 및 분수 문자열 분할에서 가져옵니다.

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이면 어떨까요? 정확한 십진수 값을 원한다고 가정합니다. 그런 다음 BigDecimal을 사용하십시오.

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태그가 항상 올바른 결과를 생성하는 것은 아니기 때문에 여기에 또 다른 JSP 전용 접근 방식이 있습니다. 숫자를 문자열로 형식화하고 문자열에 대한 나머지 계산을 수행합니다. 더 쉽고 더 많은 부동 소수점을 포함하지 않기 때문입니다. 산술.

<%@ 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이 경우에는 원하지 않는 인수를 반올림합니다.
Roland Illig

0

이러한 답변 중 상당수는 한 유형에서 다른 유형으로 숫자를 캐스팅하기 때문에 끔찍한 반올림 오류가 있습니다. 어때 :

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

@justshams 사용은 Math.abs어떻습니까?
Stephan

0

허용되는 대답은 -0과 -1.0 사이의 음수에 대해 잘 작동하지 않습니다. 또한 분수 부분을 음수로 지정하십시오.

예 : 숫자 -0,35의 경우

보고

정수 부분 = 0 분수 부분 = -0.35

wou가 GPS 좌표로 작업하는 경우 정수 부분에 다음과 같은 부호가있는 결과를 얻는 것이 좋습니다.

정수 부분 = -0 분수 부분 = 0.35

이 숫자는 예를 들어 GPS 좌표에 사용되며 위도 또는 경도 위치의 부호가 중요합니다.

코드 제안 :

    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

솔루션에 BigDecimal을 사용합니다. 이렇게 :

    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

OK 이것은 아마도 늦었을지도 모르지만 가장 정확하고 정확한 접근 방식은 BigDecimal을 사용하는 것입니다.

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

double이 있으면 부동 소수점이 있습니다. BigDecimal로 변환해도 마법처럼 정밀도가 복원되지는 않습니다.
Taschi

@Taschi 나는 그 질문이 정밀도를 복원하는 것이 아니라 정수 부분과 분수 부분을 분리하는 것이라고 생각합니다!
Omar Elashry

오마르, 당신은 당신의 접근 방식이 "더 정확"하다고 구체적으로 말씀 하셨는데, 그건 사실이 아니라고 생각합니다. 귀하의 답변은 전적으로 받아 들일 수 있지만 그 표현은 나에게 오해의 소지가있는 것 같아서 내가 그것에 대해 언급 한 것입니다.
Taschi

@Taschi, 나는 많은 답변에서 출력을 얻을 때 가치를 잃기 때문에, 예를 들어 input (5.03) output int = 5 , fractional = 0.0299999입력과 출력에 대해 이야기 하고 있기 때문에 가치 를 입력하고 0.001 %의 손실없이 가치를 되 찾는다고 말했습니다! 이 정확하고 오해의 소지가 없습니다!
Omar Elashry

예. 처음에 무언가를 double로 저장하면 정밀도가 떨어집니다. BigDecimal로 변환 할 때 반올림도 정밀도를 잃습니다. 이 두 가지 정밀도 손실은 서로 상쇄 될 수 있지만 정밀도를 복원하는 것은 수학적으로 불가능하기 때문에 정밀도를 "복원"하지는 않습니다. 허공에서 정보를 끌어낼 수 없습니다.
Taschi

-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 자리 소수가있는 경우에만 작동합니다. 그렇지 않으면.
Marquis of Lorne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.