如何在JSP / Java中从double获取整数和小数部分?

时间:2008-12-05 11:38:11

标签: java math jsp

如何在JSP / Java中从double获取整数和小数部分?如果值为3.25,那么我想获得fractional =.25whole = 3

我们如何用Java做到这一点?

19 个答案:

答案 0 :(得分:142)

double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;

答案 1 :(得分:93)

如果你使用正确的术语来搜索“从双重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

答案 2 :(得分:23)

由于这个1岁的问题是由纠正问题主题的人提出的,而且这个问题已经用 jsp 标记,并且此处没有人能够提供JSP目标答案,这里是我的JSP目标贡献。

使用JSTL(只需在/WEB-INF/libjstl-1.2.jar taglib中删除fmt即可。有一个<fmt:formatNumber>标记,可以在maxFractionDigitsmaxIntegerDigits属性的帮助下以一种非常简单的方式完成您想要的操作。

这是一个SSCCE,只是复制'n'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代码对其进行按摩。

答案 3 :(得分:7)

原始问题要求指数和尾数,而不是分数和整数。

要从double获取指数和尾数,您可以将其转换为IEEE 754表示并提取如下位:

long bits = Double.doubleToLongBits(3.25);

boolean isNegative = (bits & 0x8000000000000000L) != 0; 
long exponent      = (bits & 0x7ff0000000000000L) >> 52;
long mantissa      =  bits & 0x000fffffffffffffL;

答案 4 :(得分:5)

主逻辑你必须首先找到小数点后有多少位数  此代码适用于最多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);

答案 5 :(得分:4)

不知道这是否更快但我正在使用

float fp = ip % 1.0f;

答案 6 :(得分:4)

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),这取决于你想要这两个部分的原因。

我强烈建议您不要将这些尾数称为指数。

答案 7 :(得分:3)

[编辑:最初询问如何获取尾数和指数的问题。]

其中 n 是获得真实尾数/指数的数​​字:

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

或者,为了得到你想要的答案:

exponent = int(n)
mantissa = n - exponent

这些不是Java,但应该很容易转换。

答案 8 :(得分:2)

整数部分来自简单的转换和分数 - 字符串拆分:

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

答案 9 :(得分:1)

如果您的号码是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);

答案 10 :(得分:0)

由于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>

答案 11 :(得分:0)

很多这些答案都有可怕的舍入错误,因为它们会将数字从一种类型转换为另一种类型。怎么样:

double x=123.456;
double fractionalPart = x-Math.floor(x);
double wholePart = Math.floor(x);

答案 12 :(得分:0)

对于-0和-1.0之间的负数,接受的答案不适用 同时给出小数部分为负数。

例如: 数量为-0,35

返回

整数部分= 0 分数部分= -0.35

如果您正在使用GPS坐标,最好将整数部分的符号作为结果:

整数部分= -0 分数部分= 0.35

这些数字用于GPS坐标,其中重要的是Lat或Long位置的符号

建议代码:

    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

答案 13 :(得分:0)

从Java 8开始,您可以使用Math.floorDiv

它返回小于或等于代数商的最大(最接近正无穷大)int值。

一些例子:

floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2

或者,可以使用/运算符:

(4 / 3) == 1
(-4 / 3) == -1

参考文献:

答案 14 :(得分:0)

我会使用BigDecimal作为解决方案。像这样:

<div class="nav">
  <div class="nav_1">
  </div>
</div>

答案 15 :(得分:0)

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);
    }
}

答案 16 :(得分:0)

// target float point number
double d = 3.025;

// transfer the number to string
DecimalFormat df = new DecimalFormat();
df.setDecimalSeparatorAlwaysShown(false);
String format = df.format(d);

// split the number into two fragments
int dotIndex = format.indexOf(".");
int iPart = Integer.parseInt(format.substring(0, dotIndex)); // output: 3
double fPart = Double.parseDouble(format.substring(dotIndex)); // output: 0.025

答案 17 :(得分:0)

好的,这可能已经晚了,但是我认为最好,更准确的方法是使用BigDecimal

double d = 11.38;

BigDecimal bigD = BigDecimal.valueOf(d);
int intPart = bigD.intValue();
double fractionalPart = bigD.subtract(BigDecimal.valueOf(intPart)).doubleValue();

System.out.println(intPart); // 11
System.out.println(fractionalPart ); //0.38

答案 18 :(得分:-2)

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);
    }
}