如何在JSP / Java中将整体和小数部分加倍?

如何在JSP / Java中将整体和小数部分加倍? 如果值是3.25那么我想得到fractional =.25whole = 3

我们如何在Java中做到这一点?

谷歌会帮助你,如果你使用正确的条件来search“从双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 (只需在/WEB-INF/lib删除jstl-1.2.jar ) fmt taglib。 有一个<fmt:formatNumber>标签,它可以完成你想要的function,并且在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代码进行按摩。

原来的问题要求指数和尾数,而不是分数和整个部分。

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

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

主要的逻辑你必须先find小数点后有多less个数字。
此代码适用于任何数字高达16位数字。 如果你使用BigDecimal,你可以运行它最多18位数字。 把input值(你的号码)的variables“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的forms(即其最高位被移到二进制点之后)并且指数被调整为偏差。

从1.6开始,java.lang.Math也提供了一个直接获取无偏指数的方法(称为getExponent(double))

然而,你要求的数字是数字的整数和小数部分,可以使用它来获得

 integral = Math.floor(x) fractional = x - Math.floor(x) 

虽然你可能想要不同的对待负数(floor(-3.5) == -4.0) ,这取决于你为什么要这两个部分。

我强烈build议你不要称这些尾数和指数。

[编辑:这个问题最初问如何得到尾数和指数。]

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

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

或者,要获得您正在寻找的答案:

 exponent = int(n) mantissa = n - exponent 

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

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

 float fp = ip % 1.0f; 

如果你的电话号码是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-only的方法:它只是将数字格式化为string,然后对string进行其余的计算,因为这更容易,不涉及进一步的浮点运算。

 <%@ 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> 

很多这些答案都有可怕的四舍五入错误,因为他们正在将数字从一种types转换为另一种types。 怎么样:

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

对于-0和-1.0之间的负数,接受的答案效果不佳。也给小数部分负数。

例如:数字-0,35

回报

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

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

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

这些数字用于例如GPS坐标,其中对于纬度或长距离位置的符号是重要的

build议代码:

  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 

参考文献:

  • Java 8:Math.floorDiv(int,int)
  • Java 8:Math.floorDiv(long,long)

我会使用BigDecimal的解决scheme。 喜欢这个:

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

整数部分来自简单的转换和分数string分割:

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