Google помог бы Вам, если бы Вы использовали правильные термины для поиска, "получают дробную и целую часть из двойного 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
[Редактирование: вопрос первоначально спросил, как получить мантиссу и экспоненту.]
, Где n является числом для получения реальной мантиссы/экспоненты:
exponent = int(log(n))
mantissa = n / 10^exponent
Или, для получения ответа Вы искали:
exponent = int(n)
mantissa = n - exponent
Они не Java точно, но должны быть легки преобразовать.
Мантисса и экспонента IEEE, двойное число с плавающей точкой является значениями, таким образом, что
value = sign * (1 + mantissa) * pow(2, exponent)
, если мантисса имеет форму 0.101010101_base 2 (т.е. ее большая часть sigificant укусил, смещается, чтобы быть после двоичной точки) и экспонента корректируются для предвзятости.
С тех пор 1.6, java.lang. Математика также обеспечивает прямой метод получить несмещенную экспоненту (названный getExponent (дважды))
Однако числа, которые Вы просите, неотъемлемые и дробные части числа, которое может быть получено с помощью
integral = Math.floor(x)
fractional = x - Math.floor(x)
, хотя Вы можете Вы хотеть рассматривать отрицательные числа по-другому (floor(-3.5) == -4.0)
, завися, почему Вы хотите эти две части.
я настоятельно рекомендовал бы, чтобы Вы не называли их мантиссой и экспонентой.
Исходный вопрос задают для экспоненты и мантиссы, а не дробной и целой части.
Для получения экспоненты и мантиссы от двойного можно преобразовать его в представление IEEE 754 и извлечь биты как это:
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
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);
}
}
Поскольку этот вопрос годичной давности был поднят кем-то, кто исправил тему вопроса, и этот вопрос был помечен jsp, и никто здесь не смог дать ответ, ориентированный на 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
Дробное: .25
Вот и все. Не нужно массировать его с помощью сырого Java-кода.
Поскольку тег 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>