JSP / Java'da tam ve kesirli parçaları ikiliden nasıl alabilirim? Değer 3,25 ise o zaman almak istiyorumfractional =.25
,whole = 3
Bunu Java'da nasıl yapabiliriz?
JSP / Java'da tam ve kesirli parçaları ikiliden nasıl alabilirim? Değer 3,25 ise o zaman almak istiyorumfractional =.25
,whole = 3
Bunu Java'da nasıl yapabiliriz?
Yanıtlar:
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);
Çıktılar:
Integer part = 2
Fractional part = 0.2999999999999998
2.3
ama kesinlikle olmayan bir sayıdır 2.3
. Ve 10'dan fazla geçerli basamak istemediğiniz sürece çıktıda yanlış bir şey yoktur. İhtiyacınız olan tek şey, her çıktıda (örneğin, format %.9f
) bir miktar yuvarlamadır ve bu genellikle daha az zahmetlidir BigDecimal
. Buradaki tek sorun taşma.
(long)1.0e100
sizin için 0 alacaksınız. Çoğu zaman çift değere ihtiyaç duyduğunuzda basitçe "katlanmış" dır floor()
. Hem integral hem de kesir parçalarını istiyorsanız kullanın modf()
. Gerçekten, bu kötü bir cevap.
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
modulo ( -3.25 % 1 == 0.75
) anlamında kullanılması ve Java, Fortran, C ve C ++ gibi diğerlerinin ise %
kalan ( -3.25 % 1 == -0.25
) anlamında kullanmasıdır . WindRider, uygun olması için Python REPL'e yazmış olabilir, ancak bu cevap yanıltıcıdır çünkü bu soru JVM ile ilgilidir.
Bu 1 yıllık soru, soru konusunu düzelten biri tarafından başlatıldığından ve bu soru etiketlendi jsp ve buradaki hiç kimse JSP hedefli bir cevap veremediğinden, işte benim JSP hedefli katkım.
Kullanım JSTL (sadece damla JSTL-1.2.jar içinde /WEB-INF/lib
) fmt taglib. <fmt:formatNumber>
Tam olarak istediğinizi yapan ve yardımıyla oldukça kolay bir şekilde bir etiket var maxFractionDigits
vemaxIntegerDigits
özniteliklerle .
İşte bir SSCCE , sadece kopyalayıp yapıştırın ve çalıştırın.
<%@ 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>
Çıktı:
Bütün: 3
Kesir: 0,25
Bu kadar. Ham Java kodu yardımıyla masaj yapmaya gerek yok.
Orijinal soru, kesirli ve tam kısım yerine üs ve mantis sordu.
Bir ikiliden üs ve mantisi elde etmek için, onu IEEE 754 gösterimine dönüştürebilir ve aşağıdaki gibi bitleri çıkarabilirsiniz:
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
Temel mantık, önce ondalık noktadan sonra kaç basamak olduğunu bulmanız gerekir.
Bu kod, 16 haneye kadar herhangi bir sayı için çalışır. BigDecimal kullanıyorsanız, sadece 18 haneye kadar çalıştırabilirsiniz. girdi değerini (numaranızı) "num" değişkenine koyun, burada örnek olarak onu sabit kodladım.
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);
Bir IEEE çift kayan noktalı sayının mantisi ve üssü,
value = sign * (1 + mantissa) * pow(2, exponent)
mantis 0.101010101_base 2 biçiminde ise (yani en önemli biti ikili noktadan sonra olacak şekilde kaydırılır) ve üs önyargı için ayarlanır.
1.6'dan beri, java.lang.Math ayrıca tarafsız üssü elde etmek için doğrudan bir yöntem sağlar (getExponent (double) olarak adlandırılır)
Bununla birlikte, sorduğunuz sayılar, sayının integral ve kesirli kısımlarıdır ve bunlar kullanılarak elde edilebilir.
integral = Math.floor(x)
fractional = x - Math.floor(x)
Negatif sayıları (floor(-3.5) == -4.0)
neden iki parçayı istediğinize bağlı olarak farklı şekilde ele almak isteyebilirsiniz.
Bunlara mantis ve üs dememenizi şiddetle öneririm.
[Düzenleme: Soru başlangıçta mantis ve üssün nasıl alınacağını sordu.]
Burada n , gerçek mantis / üs elde edilecek sayıdır:
exponent = int(log(n))
mantissa = n / 10^exponent
Veya aradığınız cevabı almak için:
exponent = int(n)
mantissa = n - exponent
Bunlar tam olarak Java değildir, ancak dönüştürülmesi kolay olmalıdır.
Tamsayı kısmı basit dökümden ve kesirli - dizgi bölme işleminden elde edilir:
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
Ya numaranız 2,39999999999999 ise. Sanırım tam ondalık değeri almak istiyorsunuz. Ardından BigDecimal'i kullanın:
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);
Yana fmt:formatNumber
etiketi her zaman doğru sonuç ortaya koymamıştır, burada başka bir JSP okunur yaklaşımdır: Sadece dize olarak numarasını biçimlendirir ve ipe hesaplama gerisini, yani daha kolaydır ve kayan nokta daha da içermez beri aritmetik.
<%@ 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
bu durumda istenmeyen argümanını yuvarlar.
Kabul edilen cevap -0 ile -1.0 arasındaki negatif sayılar için pek işe yaramıyor. Ayrıca kesirli kısmı negatif veriniz.
Örneğin: -0,35 sayısı için
İadeler
Tamsayı kısmı = 0 Kesirli kısım = -0.35
GPS koordinatları ile çalışıyorsanız, tamsayı kısmında aşağıdaki gibi işaret ile bir sonuç elde etmek daha iyidir:
Tam sayı bölümü = -0 Kesirli bölüm = 0.35
Bu sayılar örneğin GPS koordinatları için kullanılır, burada Enlem veya Uzun konum için işaret önemli
Kod önerin:
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));
Çıktı:
Integer part = -0
Fractional part = 0,3500
Java 8'den beri kullanabilirsiniz Math.floorDiv
.
En büyüğü döndürür (pozitif sonsuza en yakın) int
Cebirsel bölümden küçük veya ona eşit olan değeri .
Bazı örnekler:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
Alternatif olarak, /
operatör kullanılabilir:
(4 / 3) == 1
(-4 / 3) == -1
Referanslar:
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);
}
}
// 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
Tamam, bu belki geç olabilir, ancak bence en iyi ve daha doğru yaklaşım BigDecimal kullanmaktır
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
girdi ve çıktılardan bahsediyoruz, değer koyun ve değerinizi% 0,001 kaybetmeden geri alın dedim! ve bu doğru, yanıltıcı değil!
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);
}
}