Como obtenho partes inteiras e fracionárias de double em JSP / Java? Se o valor for 3,25, então desejo obter fractional =.25
,whole = 3
Como podemos fazer isso em Java?
Como obtenho partes inteiras e fracionárias de double em JSP / Java? Se o valor for 3,25, então desejo obter fractional =.25
,whole = 3
Como podemos fazer isso em Java?
Respostas:
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);
Saídas:
Integer part = 2
Fractional part = 0.2999999999999998
2.3
, mas certamente não 2.3
. E não há nada de errado com a saída, a menos que você queira muito mais do que 10 dígitos válidos. Tudo o que você precisa é de alguns arredondamentos em cada saída (por exemplo, formato %.9f
), que geralmente é menos trabalhoso do que BigDecimal
. O único problema aqui é o estouro.
(long)1.0e100
você obterá 0. Muitas das vezes você precisa do valor duplo simplesmente "pavimentado" para o qual existe floor()
. Se você quiser usar partes integrais e fracionárias modf()
. Realmente, esta é uma resposta ruim.
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
para significar módulo ( -3.25 % 1 == 0.75
) e outras, como Java, Fortran, C e C ++, usam %
para significar resto ( -3.25 % 1 == -0.25
). WindRider pode ter digitado em um REPL do Python para conveniência, mas essa resposta é enganosa porque esta pergunta é sobre a JVM.
Uma vez que esta questão de 1 ano foi levantada por alguém que corrigiu o assunto da questão, e esta questão foi marcada com jsp, e ninguém aqui foi capaz de dar uma resposta direcionada ao JSP, aqui está minha contribuição direcionada ao JSP.
Use JSTL (apenas uma gota jstl-1.2.jar em /WEB-INF/lib
) fmt taglib. Existe uma <fmt:formatNumber>
tag que faz exatamente o que você deseja e de uma forma bastante fácil com ajuda de maxFractionDigits
e maxIntegerDigits
atributos.
Aqui está um SSCCE , apenas copie e cole e execute -o.
<%@ 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>
Resultado:
Inteiro: 3
Fração: 0,25
É isso aí. Não há necessidade de massagear com a ajuda de código Java bruto.
A pergunta original pedia o expoente e a mantissa, ao invés da parte fracionária e inteira.
Para obter o expoente e a mantissa de um duplo, você pode convertê-lo na representação IEEE 754 e extrair os bits assim:
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
Lógica principal, você deve primeiro descobrir quantos dígitos existem após o ponto decimal.
Este código funciona para qualquer número de até 16 dígitos. Se você usar BigDecimal, poderá executá-lo com até 18 dígitos. coloque o valor de entrada (seu número) na variável "num", aqui como um exemplo, codifiquei-o.
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);
A mantissa e o expoente de um número de ponto flutuante duplo IEEE são os valores tais que
value = sign * (1 + mantissa) * pow(2, exponent)
se a mantissa é da forma 0,101010101_base 2 (ou seja, seu bit mais significativo é deslocado para estar após o ponto binário) e o expoente é ajustado para polarização.
Desde 1.6, java.lang.Math também fornece um método direto para obter o expoente imparcial (chamado getExponent (double))
No entanto, os números que você está pedindo são as partes integrais e fracionárias do número, que podem ser obtidas usando
integral = Math.floor(x)
fractional = x - Math.floor(x)
embora você possa tratar os números negativos de forma diferente (floor(-3.5) == -4.0)
, dependendo do motivo pelo qual deseja as duas partes.
Eu sugiro fortemente que você não os chame de mantissa e expoente.
[Editar: a questão originalmente perguntada como obter a mantissa e o expoente.]
Onde n é o número para obter a mantissa / expoente real:
exponent = int(log(n))
mantissa = n / 10^exponent
Ou, para obter a resposta que você estava procurando:
exponent = int(n)
mantissa = n - exponent
Eles não são exatamente Java, mas devem ser fáceis de converter.
A parte inteira obtém da conversão simples e para a divisão de string fracionária:
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
E se o seu número for 2.39999999999999. Suponho que você deseja obter o valor decimal exato. Em seguida, use 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);
Visto que a fmt:formatNumber
tag nem sempre produz o resultado correto, aqui está outra abordagem apenas JSP: ela apenas formata o número como string e faz o resto do cálculo na string, já que é mais fácil e não envolve mais ponto flutuante aritmética.
<%@ 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
arredonda seu argumento, o que não é desejado neste caso.
A resposta aceita não funciona bem para números negativos entre -0 e -1,0. Forneça também a parte fracionária negativa.
Por exemplo: Para o número -0,35
retorna
Parte inteira = 0 Parte fracionária = -0,35
Se você estiver trabalhando com coordenadas GPS, é melhor ter um resultado com o sinal na parte inteira como:
Parte inteira = -0 Parte fracionária = 0,35
Esses números são usados, por exemplo, para coordenadas de GPS, onde são importantes o sinal para a posição Lat ou Longa
Propor código:
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));
Resultado:
Integer part = -0
Fractional part = 0,3500
Desde Java 8, você pode usar Math.floorDiv
.
Ele retorna o maior valor (mais próximo do infinito positivo) int
que é menor ou igual ao quociente algébrico.
Alguns exemplos:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
Alternativamente, o /
operador pode ser usado:
(4 / 3) == 1
(-4 / 3) == -1
Referências:
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, talvez seja tarde, mas acho que a abordagem melhor e mais precisa é usar 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
, estamos falando de entradas e saídas, você coloca valor e recupera seu valor sem perder 0,001% dele! e isso é preciso, não enganoso!
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);
}
}