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.