17 ответов:
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.банку на
/WEB-INF/lib)fmt taglib. Там есть<fmt:formatNumber>тег, который делает именно то, что вы хотите, и в довольно легкой манере с помощьюmaxFractionDigitsиmaxIntegerDigitsатрибуты.здесь SSCCE, просто скопируйте'paste-эн-эн чувак он.
<%@ 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.ленг.Математика также предоставляет прямой метод для получения несмещенного показателя (называемого getExponent (double))
однако числа, которые вы просите, являются интегральными и дробные части числа, которые можно получить с помощью
integral = Math.floor(x) fractional = x - Math.floor(x)хотя вы можете вы хотите относиться к отрицательным числам по-разному
(floor(-3.5) == -4.0)в зависимости от того, почему вы хотите на две части.я настоятельно рекомендую вам не называть эти мантиссы и экспоненты.
[Edit: вопрос изначально задавался, как получить мантиссу и экспоненту.]
здесь n это число, чтобы получить реальную мантиссу / показатель:
exponent = int(log(n)) mantissa = n / 10^exponentили, чтобы получить ответ, вы искали:
exponent = int(n) mantissa = n - exponentэто не Java точно, но должно быть легко конвертировать.
Что делать, если ваш номер 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);
целочисленная часть получается из простого приведения и для дробного разбиения строки:
double value = 123.004567890 int integerPart; int fractionPart; /** * To control zeroes omitted from start after parsing. */ int decimals; integerPart = (int) value; // 123 fractionPart = Integer.valueOf( String.valueOf(value) .split(".") [1]); // 004567890 decimals = String.valueOf(value) .split(".") [1] .length(); // 9
С
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>
многие из этих ответов имеют ужасные ошибки округления, потому что они бросают числа из одного типа в другой. Как насчет:
double x=123.456; double fractionalPart = x-Math.floor(x); double wholePart = Math.floor(x);
принятый ответ не работает для отрицательных чисел между -0 и -1,0 Также дайте дробную часть отрицательной.
например: Для -0,35
возвращает
целая часть = 0 Дробная часть = -0.35
Если wou работают с координатами GPS, то лучше иметь результат с сигнумом на целой части как:
целая часть = -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); } }
Comments