web-dev-qa-db-ja.com

JSP / Javaでdoubleから整数部分と小数部分を取得するにはどうすればよいですか?

JSP/Javaでdoubleから整数部分と小数部分を取得するにはどうすればよいですか?値が3.25の場合、fractional =.25whole = 3を取得したい

Javaでこれを行うにはどうすればよいですか?

90

適切な用語を使用して「二重Javaから小数部と全体を取り出す」を検索した場合、Googleがお手伝いします。

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
95
Gishu
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
142
Dan Vinton

この1年前の質問は、質問の件名を修正した人によってキックアップされたため、この質問には jsp、JSPをターゲットにした回答をここでだれも提供できませんでした。これが私のJSPをターゲットにした投稿です。

JSTL/WEB-INF/libjstl-1.2.jar をドロップするだけ) ) fmt taglib。 <fmt:formatNumber> タグがあります。これは、maxFractionDigitsおよびmaxIntegerDigits属性の助けを借りて、まさに必要なことを非常に簡単に実行します。

ここに SSCCE があります。単にcopy'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コードを使用してマッサージする必要はありません。

23
BalusC

元の質問では、小数部と整数部ではなく、指数部と仮数部が求められました。

Doubleから指数と仮数を取得するには、それを IEEE 754 表現に変換し、次のようにビットを抽出します。

long bits = Double.doubleToLongBits(3.25);

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

メインロジックでは、最初に小数点以下の桁数を見つける必要があります。
このコードは、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
OnePunchMan

IEEEの倍精度浮動小数点数の仮数と指数は、次のような値です。

value = sign * (1 + mantissa) * pow(2, exponent)

仮数の形式が0.101010101_base 2の場合(つまり、最上位ビットが2進小数点の後にシフトされる)、指数がバイアス用に調整される場合。

1.6以降、Java.lang.Mathは、不偏指数を取得する直接メソッド(getExponent(double)と呼ばれる)も提供します。

ただし、求める数値は整数の整数部分と小数部分であり、次を使用して取得できます。

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

ただし、2つの部分が必要な理由に応じて、(floor(-3.5) == -4.0)のように負の数を異なる方法で処理することもできます。

これらの仮数および指数を呼び出さないことを強くお勧めします。

4
Pete Kirkham

これが速いかどうかわかりませんが、私は使っています

float fp = ip % 1.0f;
4
QED

[編集:もともと仮数と指数を取得する方法を尋ねられた質問。]

ここで、nは実際の仮数/指数を取得する数値です。

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

または、あなたが探していた答えを得るには:

exponent = int(n)
mantissa = n - exponent

これらは正確にはJavaではありませんが、簡単に変換できるはずです。

3

整数部分は単純なキャストから取得し、分数-文字列分割のために:

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
2
Zon

番号が2.39999999999999の場合はどうなりますか。正確な10進数値を取得したいと思います。次に、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);
1
roybraym

fmt:formatNumberタグは常に正しい結果を生成するとは限らないため、JSP専用の別のアプローチを次に示します。数値を文字列としてフォーマットし、残りの計算を文字列で実行します。 tはさらに浮動小数点演算を伴います。

<%@ 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>
0
Roland Illig

これらの答えの多くは、あるタイプから別のタイプに数字をキャストしているため、恐ろしい丸めエラーがあります。どうですか:

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

ソリューションにはBigDecimalを使用します。このような:

    double value = 3.25;
    BigDecimal wholeValue = BigDecimal.valueOf(value).setScale(0, BigDecimal.ROUND_DOWN);
    double fractionalValue = value - wholeValue.doubleValue();
0
Endery

-0から-1.0の間の負の数では、受け入れられた答えはうまく機能しません。また、小数部分を負にします。

例:数値-0,35の場合

返却値

整数部= 0小数部= -0.35

WouがGPS座標を使用している場合、整数部の符号で次のような結果を得ることをお勧めします。

整数部= -0小数部= 0.35

これらの番号は、たとえばGPS座標に使用されます。GPS座標では、緯度または経度の位置のサインが重要です

コードを提案する:

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

Java 8以降、Math.floorDivを使用できます。

代数商以下の最大(正の無限大に最も近い)int値を返します。

いくつかの例:

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

または、/演算子を使用できます。

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

参照:

0
Stephan