Как я могу получить целые и дробные части из double в JSP/Java? Если значение равно 3,25, то я хочу получить fractional =.25
, whole = 3
Как мы можем это сделать в Java?
Как я могу получить целые и дробные части из double в JSP/Java? Если значение равно 3,25, то я хочу получить fractional =.25
, whole = 3
Как мы можем это сделать в Java?
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
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
Поскольку этот 1-летний вопрос был поднят кем-то, кто исправил тему вопроса, и этот вопрос был помечен jsp, и никто здесь не смог дать целевой ответ JSP, вот мой JSP-целевой вклад.
Используйте JSTL (просто снимите jstl-1.2.jar in /WEB-INF/lib
) fmt taglib. Там <fmt:formatNumber>
тег, который делает именно то, что вы хотите и довольно легко с помощью атрибутов maxFractionDigits
и maxIntegerDigits
.
Здесь SSCCE, просто скопируйте'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.
Первоначальный вопрос задал экспоненту и мантиссе, а не дробную и целую часть.
Чтобы получить показатель экспоненты и мантиссы из двойника, вы можете преобразовать его в представление 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)
, в зависимости от того, зачем вам нужны две части.
Я бы сказал, что вы не называете эту мантию и экспонента.
Не знаю, работает ли это быстрее, но я использую
float fp = ip % 1.0f;
[Изменить: вопрос первоначально задавался вопросом, как получить мантиссы и экспонента.]
Где n - это число, чтобы получить реальный показатель мантиссы/экспонента:
exponent = int(log(n))
mantissa = n / 10^exponent
Или, чтобы получить ответ, который вы искали:
exponent = int(n)
mantissa = n - exponent
Это не Java точно, но их легко конвертировать.
Целочисленная часть получается из простого приведения и дробного разделения строк:
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: он просто форматирует число как строку и выполняет остальную часть вычисления в строке, поскольку это проще и doesn 't вовлекает дальнейшую арифметику с плавающей запятой.
<%@ 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>
Многие из этих ответов имеют ужасные ошибки округления, потому что они отливают числа от одного типа к другому. Как насчет:
double x=123.456;
double fractionalPart = x-Math.floor(x);
double wholePart = Math.floor(x);
Принятый ответ плохо работает для отрицательных чисел от -0 до -1.0 Также дайте дробную часть отрицательной.
Например: Для числа -0,35
возвращает
Целочисленная часть = 0 Дробная часть = -0,35
Если вы работаете с координатами GPS, лучше иметь результат с signum на целой части как:
Целочисленная часть = -0 Дробная часть = 0,35
Цифры данных используются, например, для GPS-координат, где важны signum для Lat или Long position
Код предложения:
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
Литература:
Я бы использовал BigDecimal для решения. Вот так:
double value = 3.25;
BigDecimal wholeValue = BigDecimal.valueOf(value).setScale(0, BigDecimal.ROUND_DOWN);
double fractionalValue = value - wholeValue.doubleValue();
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);
}
}
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);
}
}