JSP/Javaでdoubleから整数部分と小数部分を取得するにはどうすればよいですか?値が3.25の場合、fractional =.25
、whole = 3
を取得したい
Javaでこれを行うにはどうすればよいですか?
適切な用語を使用して「二重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
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>
タグがあります。これは、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コードを使用してマッサージする必要はありません。
元の質問では、小数部と整数部ではなく、指数部と仮数部が求められました。
Doubleから指数と仮数を取得するには、それを IEEE 754 表現に変換し、次のようにビットを抽出します。
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
メインロジックでは、最初に小数点以下の桁数を見つける必要があります。
このコードは、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);
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)
のように負の数を異なる方法で処理することもできます。
これらの仮数および指数を呼び出さないことを強くお勧めします。
これが速いかどうかわかりませんが、私は使っています
float fp = ip % 1.0f;
[編集:もともと仮数と指数を取得する方法を尋ねられた質問。]
ここで、nは実際の仮数/指数を取得する数値です。
exponent = int(log(n))
mantissa = n / 10^exponent
または、あなたが探していた答えを得るには:
exponent = int(n)
mantissa = n - exponent
これらは正確にはJavaではありませんが、簡単に変換できるはずです。
整数部分は単純なキャストから取得し、分数-文字列分割のために:
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.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);
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>
これらの答えの多くは、あるタイプから別のタイプに数字をキャストしているため、恐ろしい丸めエラーがあります。どうですか:
double x=123.456;
double fractionalPart = x-Math.floor(x);
double wholePart = Math.floor(x);
ソリューションにはBigDecimalを使用します。このような:
double value = 3.25;
BigDecimal wholeValue = BigDecimal.valueOf(value).setScale(0, BigDecimal.ROUND_DOWN);
double fractionalValue = value - wholeValue.doubleValue();
-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
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);
}
}
Java 8以降、Math.floorDiv
を使用できます。
代数商以下の最大(正の無限大に最も近い)int
値を返します。
いくつかの例:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
または、/
演算子を使用できます。
(4 / 3) == 1
(-4 / 3) == -1
参照: