如何在JSP / Java中将整体和小数部分加倍?
如何在JSP / Java中将整体和小数部分加倍? 如果值是3.25那么我想得到fractional =.25
, whole = 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,并且在maxFractionDigits
和maxIntegerDigits
属性的帮助下以一种非常简单的方式进行。
这是一个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); } }