Как получить целые и дробные части из двойного в JSP / Java? - PullRequest
88 голосов
/ 05 декабря 2008

Как получить целые и дробные части из double в JSP / Java? Если значение 3,25, то я хочу получить fractional =.25, whole = 3

Как мы можем сделать это на Java?

Ответы [ 17 ]

142 голосов
/ 05 декабря 2008
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
93 голосов
/ 05 декабря 2008

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
23 голосов
/ 13 февраля 2010

Поскольку этот годичный вопрос был задан кем-то, кто исправил тему вопроса, и этот вопрос был помечен jsp , и никто здесь не смог дать целевой ответ JSP, вот мой JSP-ориентированный вклад.

Используйте JSTL (просто бросьте jstl-1.2.jar in /WEB-INF/lib) fmt taglib. Есть тег <fmt:formatNumber>, который делает именно то, что вы хотите, и довольно легко с помощью атрибутов 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.

7 голосов
/ 05 декабря 2008

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

Чтобы получить показатель степени и мантиссу из двойного числа, вы можете преобразовать ее в представление IEEE 754 и извлечь биты следующим образом:

long bits = Double.doubleToLongBits(3.25);

boolean isNegative = (bits & 0x8000000000000000L) != 0; 
long exponent      = (bits & 0x7ff0000000000000L) >> 52;
long mantissa      =  bits & 0x000fffffffffffffL;
5 голосов
/ 29 августа 2013

Основная логика: сначала нужно найти количество цифр после десятичной точки.
Этот код работает для любого числа до 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);
4 голосов
/ 10 октября 2013

Не знаю, быстрее ли это, но я использую

float fp = ip % 1.0f;
4 голосов
/ 05 декабря 2008

Мантисса и показатель степени двойного числа с плавающей запятой 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), в зависимости от того, почему вам нужны эти две части.

Я настоятельно рекомендую вам не называть эти мантиссы и экспоненты.

3 голосов
/ 05 декабря 2008

[Редактировать: Первоначально был задан вопрос, как получить мантиссу и экспоненту.] Где n - число для получения реальной мантиссы / показателя степени:

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

Или, чтобы получить ответ, который вы искали:

exponent = int(n)
mantissa = n - exponent

Это не совсем Java, но их легко конвертировать.

2 голосов
/ 06 июня 2017

Целочисленная часть получается из простого приведения и дробного дробления строки:

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
1 голос
/ 22 октября 2016

Что делать, если ваш номер 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...