Как я получаю целые и дробные части от дважды в JSP/Java?

92
задан Vadim Kotov 29 July 2019 в 14:40
поделиться

8 ответов

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
95
ответ дан Gishu 24 November 2019 в 06:23
поделиться

[Редактирование: вопрос первоначально спросил, как получить мантиссу и экспоненту.]

, Где n является числом для получения реальной мантиссы/экспоненты:

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

Или, для получения ответа Вы искали:

exponent = int(n)
mantissa = n - exponent

Они не Java точно, но должны быть легки преобразовать.

3
ответ дан Stephen Darlington 24 November 2019 в 06:23
поделиться

Мантисса и экспонента 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), завися, почему Вы хотите эти две части.

я настоятельно рекомендовал бы, чтобы Вы не называли их мантиссой и экспонентой.

4
ответ дан Stephan 24 November 2019 в 06:23
поделиться

Исходный вопрос задают для экспоненты и мантиссы, а не дробной и целой части.

Для получения экспоненты и мантиссы от двойного можно преобразовать его в представление IEEE 754 и извлечь биты как это:

long bits = Double.doubleToLongBits(3.25);

boolean isNegative = (bits & 0x8000000000000000L) != 0; 
long exponent      = (bits & 0x7ff0000000000000L) >> 52;
long mantissa      =  bits & 0x000fffffffffffffL;
7
ответ дан Rasmus Faber 24 November 2019 в 06:23
поделиться
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
145
ответ дан Dan Vinton 24 November 2019 в 06:23
поделиться
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);
    }
}
-2
ответ дан Michael Myers 24 November 2019 в 06:23
поделиться

Поскольку этот вопрос годичной давности был поднят кем-то, кто исправил тему вопроса, и этот вопрос был помечен 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-кода.

23
ответ дан 24 November 2019 в 06:23
поделиться

Поскольку тег 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>
0
ответ дан 24 November 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: