source

JSP/Java에서 전체 부품과 부분 부품을 더블에서 가져오려면 어떻게 해야 합니까?

factcode 2022. 9. 12. 11:33
반응형

JSP/Java에서 전체 부품과 부분 부품을 더블에서 가져오려면 어떻게 해야 합니까?

JSP/Java에서 전체 부품과 부분 부품을 더블에서 가져오려면 어떻게 해야 합니까? 값이 3.25이면 가져오고 싶습니다.fractional =.25,whole = 3

자바에서는 어떻게 할 수 있을까요?

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

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

이 1년차 질문은 문제의 주제를 수정한 사람에 의해 제기되었고, 이 질문에는 태그가 붙어 있어 아무도 JSP에 의한 답변을 할 수 없었기 때문에, 여기 JSP에 의한 기고가 있습니다.

JSTL을 사용합니다(jstl-1.2.jar를 드롭하기만 하면 됩니다)./WEB-INF/lib) fmt taglib 입니다.태그가 있어 원하는 대로 쉽게 할 수 있습니다.maxFractionDigits그리고.maxIntegerDigits특성.

여기 SSCCE가 있으니 복사해서 붙여넣기만 하면 됩니다.

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

분수: 0.25

바로 그겁니다.raw Java 코드를 사용하여 마사지할 필요가 없습니다.

원래 질문은 분수 부분과 전체 부분보다는 지수와 가수 부분을 요구했습니다.

배수의 지수와 가수를 얻으려면 이를 IEEE 754 표현으로 변환하고 다음과 같은 비트를 추출합니다.

long bits = Double.doubleToLongBits(3.25);

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

이게 더 빠를지 모르겠지만 저는 이걸 쓰고 있어요.

float fp = ip % 1.0f;

주요 논리는 먼저 소수점 뒤에 몇 자리 숫자가 있는지 찾아야 합니다.
이 코드는 최대 16자리까지 사용할 수 있습니다.Big Decimal을 사용하면 최대 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);

IEEE 이중 부동소수점 번호의 가수 및 지수는 다음과 같은 값입니다.

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

가 0.1010101_base 2 형식인 경우(즉, 가장 중요한 비트가 2진수점 이후가 되도록 이동함) 지수를 바이어스에 맞게 조정합니다.

1.6 이후 java.lang.또한 수학은 편향되지 않은 지수(getExponent(double)라고 함)를 얻기 위한 직접적인 방법을 제공합니다.

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

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

음수를 다르게 다루고 싶어도(floor(-3.5) == -4.0)두 부품을 원하는 이유에 따라 달라집니다.

이 가수나 지수라고 부르지 말아주세요

[편집: 질문은 원래 가수와 지수를 구하는 방법을 물었습니다]

여기서 n은 실제 가수/exponent를 얻는 숫자입니다.

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

또는 원하는 답변을 얻으려면 다음과 같이 하십시오.

exponent = int(n)
mantissa = n - exponent

Java는 아니지만 변환이 쉬울 것입니다.

만약 당신의 번호가 2.3999999999999라면요?정확한 10진수 값을 얻고 싶으시겠죠?다음으로 Big Decimal을 사용합니다.

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

★★★★★★★★★★★★★★★★★.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>

이 답변들 중 상당수는 한 유형에서 다른 유형으로 번호를 할당하기 때문에 끔찍한 반올림 오류를 가지고 있습니다.그럼 어떻게 해?

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

-0과 -1.0 사이의 음수에는 합격된 답이 잘 작동하지 않습니다. 또한 소수 부분에는 음수를 지정합니다.

예를 들어 다음과 같습니다.번호 -0,35의 경우

돌아온다

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

GPS 좌표를 사용하는 경우 정수 부분의 부호로 다음과 같은 결과를 얻는 것이 좋습니다.

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

이 숫자는 GPS 좌표에 사용됩니다. 여기서 Lat 또는 Long 위치에 대한 부호가 중요합니다.

제안 코드:

    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

8부터 8을 사용할 수 .Math.floorDiv.

큰에서 양의 무한대까지)을 반환합니다.int대수적 몫보다 작거나 같은 값

몇 가지 예:

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

「」도 ./연산자를 사용할 수 있습니다.

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

참고 자료:

솔루션에는 Big Decimal을 사용합니다.다음과 같이 합니다.

    double value = 3.25;
    BigDecimal wholeValue = BigDecimal.valueOf(value).setScale(0, BigDecimal.ROUND_DOWN);
    double fractionalValue = value - wholeValue.doubleValue();
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);
    }
}
// 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

네, 늦은 감이 있지만 Big Decimal을 사용하는 것이 가장 정확하고 최선의 접근법이라고 생각합니다.

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

언급URL : https://stackoverflow.com/questions/343584/how-do-i-get-whole-and-fractional-parts-from-double-in-jsp-java

반응형