JSP / Javaでdoubleから整数部分と小数部分を取得するにはどうすればよいですか?値が3.25の場合、を取得しますfractional =.25
。whole = 3
これをJavaでどのように実行できますか?
JSP / Javaでdoubleから整数部分と小数部分を取得するにはどうすればよいですか?値が3.25の場合、を取得しますfractional =.25
。whole = 3
これを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
2.3
が、確かにそうではありません2.3
。また、10桁を超える有効な数字が必要でない限り、出力に問題はありません。必要なのは、各出力(たとえば、format %.9f
)の丸めだけBigDecimal
です。ここでの唯一の問題はオーバーフローです。
(long)1.0e100
あなたのために0を取得します。多くの場合、あなたは、単に「フローリング」されているdouble値が必要ですfloor()
。整数部と小数部の両方が必要な場合は、を使用してくださいmodf()
。本当に、これは悪い答えです。
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
モジュロ(-3.25 % 1 == 0.75
)を意味するために使用し、Java、Fortran、C、およびC ++などの他の言語が%
剰余(-3.25 % 1 == -0.25
)を意味するために使用するためです。WindRiderは便宜上、それをPython REPLに入力した可能性がありますが、この質問はJVMに関するものであるため、その答えは誤解を招くものです。
この1年前の質問は、質問の件名を修正した人によって蹴られ、この質問にはのタグが付けられておりjsp、JSPを対象とした回答を提供できなかったため、ここに私のJSPを対象とした貢献を示します。
使用JSTL(ちょうどドロップJSTL-1.2.jarをして/WEB-INF/lib
)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)
ただし(floor(-3.5) == -4.0)
、2つの部分が必要な理由に応じて、負の数を異なる方法で処理することもできます。
これらの仮数と指数を呼び出さないことを強くお勧めします。
[編集:最初は、仮数と指数を取得する方法を質問しました。]
ここで、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のみのアプローチである:それは簡単ですし、さらに浮動小数点を必要としないので、それはちょうど、文字列として番号をフォーマットし、文字列の計算の残りの部分はありません算術。
<%@ 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>
fmt:formatNumber
この場合は不要な引数を丸めます。
受け入れられた回答は、-0から-1.0の間の負の数ではうまく機能しません。また、小数部を負にしてください。
例:数値-0,35の場合
戻り値
整数部= 0分数部= -0.35
wouがGPS座標を使用している場合、整数部分の符号が次のような結果になるようにすることをお勧めします。
整数部= -0分数部= 0.35
これらの数値は、たとえば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
Java 8以降、を使用できますMath.floorDiv
。
最大(正の無限大に最も近い)を返します int
代数商以下値を。
いくつかの例:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
または、/
演算子を使用することもできます。
(4 / 3) == 1
(-4 / 3) == -1
参照:
// target float point number
double d = 3.025;
// transfer the number to string
DecimalFormat df = new DecimalFormat();
df.setDecimalSeparatorAlwaysShown(false);
String format = df.format(d);
// split the number into two fragments
int dotIndex = format.indexOf(".");
int iPart = Integer.parseInt(format.substring(0, dotIndex)); // output: 3
double fPart = Double.parseDouble(format.substring(dotIndex)); // output: 0.025
OKこれは多分遅いですが、最良かつより正確なアプローチはBigDecimalを使用することです
double d = 11.38;
BigDecimal bigD = BigDecimal.valueOf(d);
int intPart = bigD.intValue();
double fractionalPart = bigD.subtract(BigDecimal.valueOf(intPart)).doubleValue();
System.out.println(intPart); // 11
System.out.println(fractionalPart ); //0.38
input (5.03)
output int = 5 , fractional = 0.0299999
私たちは入力と出力について話しているので、あなたは値を入れてそれの0.001%を失うことなくあなたの価値を取り戻します!そして、これは正確で、誤解を招きません!