JSP / Java의 double에서 전체 및 부분 부분을 어떻게 얻습니까? 값이 3.25이면을 얻고 싶습니다 fractional =.25
.whole = 3
Java에서 어떻게 할 수 있습니까?
JSP / Java의 double에서 전체 및 부분 부분을 어떻게 얻습니까? 값이 3.25이면을 얻고 싶습니다 fractional =.25
.whole = 3
Java에서 어떻게 할 수 있습니까?
답변:
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
2.3
이지만 확실히 아닙니다 2.3
. 그리고 10 개 이상의 유효한 숫자를 원하지 않는 한 출력에 문제가 없습니다. 필요한 것은 각 출력 (예 : format %.9f
) 에서 반올림 하는 것 뿐이며 일반적으로 BigDecimal
. 여기서 유일한 문제는 오버플로입니다.
(long)1.0e100
0을 얻을 수 있기 때문입니다 floor()
. 많은 경우 단순히 "floored"가있는 double 값이 필요합니다 . 정수 부분과 분수 부분을 모두 사용하려면 modf()
. 정말로 이것은 잘못된 대답입니다.
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
는 모듈로 ( -3.25 % 1 == 0.75
) 를 의미 하고 Java, Fortran, C 및 C ++와 같은 다른 언어 %
는 나머지 ( -3.25 % 1 == -0.25
) 를 의미하기 때문 입니다. WindRider는 편의를 위해 Python REPL에 입력했을 수 있지만이 질문은 JVM에 관한 것이기 때문에 그 대답은 잘못된 것입니다.
이 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 코드를 사용하여 마사지 할 필요가 없습니다.
원래 질문은 분수와 전체 부분이 아닌 지수와 가수를 요구했습니다.
double에서 지수와 가수를 얻으려면 IEEE 754 표현 으로 변환하고 다음 과 같이 비트를 추출 할 수 있습니다 .
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
주 논리는 먼저 소수점 뒤에 몇 자리가 있는지 찾아야합니다.
이 코드는 최대 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);
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)
두 부분을 원하는 이유에 따라 음수를 다르게 처리하고 싶을 수도 있습니다 .
이 가수와 지수를 부르지 말 것을 강력히 제안합니다.
정수 부분은 단순 캐스팅 및 분수 문자열 분할에서 가져옵니다.
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
귀하의 번호가 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);
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
이 경우에는 원하지 않는 인수를 반올림합니다.
허용되는 대답은 -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
Java 8부터 Math.floorDiv
.
가장 큰 값을 반환합니다 (양의 무한대에 가장 가깝 음). int
대수 몫보다 작거나 같은 값을 .
몇 가지 예 :
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
또는 /
연산자를 사용할 수 있습니다.
(4 / 3) == 1
(-4 / 3) == -1
참조 :
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
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
input (5.03)
output int = 5 , fractional = 0.0299999
입력과 출력에 대해 이야기 하고 있기 때문에 가치 를 입력하고 0.001 %의 손실없이 가치를 되 찾는다고 말했습니다! 이 정확하고 오해의 소지가 없습니다!
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);
}
}