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

Vin*_*tti 94 java math jsp

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

我们怎样才能在Java中做到这一点?

Dan*_*ton 147

double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
Run Code Online (Sandbox Code Playgroud)

  • 为什么这会被贬低?工作正常,我的编辑也将使用负值. (12认同)
  • 这里的混淆是因为某些语言(如Python)使用`%`表示模数(`-3.25%1 == 0.75`)而其他语言(如Java,Fortran,C和C++)使用`%`表示余数(`-3.25%1 == -0.25`).为了方便起见,WindRider可能已将其键入Python REPL,但该答案具有误导性,因为这个问题与JVM有关. (5认同)
  • 不适用于否定.值.即-3.25%1 = 0.75而不是0.25.所以integralPart将是-3.25 - 0.75 = -4. (2认同)
  • @WindRider,我检查了否定..它的作品..然而对于数量很少的小数位,会有轻微的错误.防爆.对于-03.0025,它返回-0.0024999999999999467和-3.0 (2认同)

Gis*_*shu 95

如果您使用正确的术语搜索"从双重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);
Run Code Online (Sandbox Code Playgroud)

输出:

Integer part = 2
Fractional part = 0.2999999999999998
Run Code Online (Sandbox Code Playgroud)

  • 实际上这个页面是谷歌搜索"从双java获取分数和整个部分"的第一个命中=) (59认同)
  • 实际上这个答案是不正确的,因为大于long的值可以表示它将在小数部分给出大量数字.Dan Vinton的回答同样简单,总是会返回正确的结果. (11认同)
  • @mojuba Java 中没有 `modf()` (3认同)
  • 实际上,这是不正确的,正如您在输出中看到的那样.输入是3的分数,输出是29999999 ...但是使用BigDecimal而不是Double将会做到这一点 (2认同)
  • @Alex不,输入是一个非常接近"2.3"的数字,但肯定不是"2.3".并且输出没有任何问题,除非您需要超过10个有效数字.你需要的只是每个输出中的一些舍入(例如,格式为'%.9f`),这通常比`BigDecimal`痛苦.这里唯一的问题是溢出. (2认同)

Bal*_*usC 23

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

使用JSTL(刚落,JSTL-1.2.jar/WEB-INF/lib)FMT的taglib.有一个<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>
Run Code Online (Sandbox Code Playgroud)

输出:

整体:3

分数:.25

而已.无需借助原始Java代码对其进行按摩.


Ras*_*ber 8

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

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

long bits = Double.doubleToLongBits(3.25);

boolean isNegative = (bits & 0x8000000000000000L) != 0; 
long exponent      = (bits & 0x7ff0000000000000L) >> 52;
long mantissa      =  bits & 0x000fffffffffffffL;
Run Code Online (Sandbox Code Playgroud)


Pet*_*ham 5

IEEE 双浮点数的尾数和指数是这样的值:

value = sign * (1 + mantissa) * pow(2, exponent)
Run Code Online (Sandbox Code Playgroud)

如果尾数的形式为 0.101010101_base 2(即其最重要的位被移动到二进制小数点之后)并且指数被调整为偏差。

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

但是,您要求的数字是数字的整数部分和小数部分,可以使用

integral = Math.floor(x)
fractional = x - Math.floor(x)
Run Code Online (Sandbox Code Playgroud)

尽管您可能希望以不同的方式对待负数(floor(-3.5) == -4.0),这取决于您想要这两个部分的原因。

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


One*_*Man 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);
Run Code Online (Sandbox Code Playgroud)

  • @Gray 问题是将 3.25 分隔为“3”和“25”,接受的答案永远不会给出“25”,它总是给出“2599999999” (2认同)
  • 如果您希望小数部分为整数,则此anwer非常有用 (2认同)

QED*_*QED 5

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

float fp = ip % 1.0f;
Run Code Online (Sandbox Code Playgroud)