ฉันจะรับชิ้นส่วนทั้งหมดและเศษส่วนจาก double ใน JSP / Java ได้อย่างไร หากมีค่าเป็น 3.25 แล้วผมต้องการที่จะได้รับfractional =.25
,whole = 3
เราจะทำสิ่งนี้ใน Java ได้อย่างไร?
ฉันจะรับชิ้นส่วนทั้งหมดและเศษส่วนจาก double ใน JSP / Java ได้อย่างไร หากมีค่าเป็น 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 หลัก ทั้งหมดที่คุณต้องมีการปัดเศษบางอย่างในแต่ละเอาท์พุท (เช่นรูปแบบ%.9f
) BigDecimal
ซึ่งเป็นอาการปวดมักจะน้อยกว่า ปัญหาเดียวที่นี่คือล้น
(long)1.0e100
คุณจะได้รับ 0. หลายครั้งที่คุณต้องการค่า double เพียงแค่ "ปูพื้น" floor()
ซึ่งมี modf()
หากคุณต้องการทั้งหนึ่งและส่วนชิ้นส่วนที่ใช้ จริงๆนี่เป็นคำตอบที่ไม่ดี
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
เพื่อหมายถึง modulo ( -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 ดิบ
คำถามเดิมถามหาเลขชี้กำลังและแมนทิสซาแทนที่จะเป็นเศษส่วนและส่วนทั้งหมด
ในการรับเลขชี้กำลังและแมนทิสซาจากคู่คุณสามารถแปลงเป็นตัวแทน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 (นั่นคือบิตที่มีนัยสำคัญที่สุดจะถูกเลื่อนไปอยู่หลังจุดไบนารี) และเลขชี้กำลังจะถูกปรับสำหรับไบแอส
ตั้งแต่ 1.6 java.lang.Math ยังมีวิธีการโดยตรงในการรับเลขชี้กำลังที่เป็นกลาง (เรียกว่า getExponent (double))
อย่างไรก็ตามตัวเลขที่คุณขอเป็นส่วนหนึ่งและเศษส่วนของจำนวนซึ่งสามารถหาได้โดยใช้
integral = Math.floor(x)
fractional = x - Math.floor(x)
แม้ว่าคุณอาจต้องการใช้จำนวนลบแตกต่างกัน(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 ฉันคิดว่าคุณต้องการได้ค่าทศนิยมแน่นอน จากนั้นใช้ 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
ปัดเศษอาร์กิวเมนต์ซึ่งไม่ต้องการในกรณีนี้
คำตอบเหล่านี้จำนวนมากมีข้อผิดพลาดในการปัดเศษที่น่ากลัวเนื่องจากกำลังส่งตัวเลขจากประเภทหนึ่งไปยังอีกประเภทหนึ่ง เกี่ยวกับ:
double x=123.456;
double fractionalPart = x-Math.floor(x);
double wholePart = Math.floor(x);
Math.abs
ไง?
คำตอบที่ยอมรับใช้ไม่ได้ผลสำหรับจำนวนลบระหว่าง -0 ถึง -1.0 ให้ส่วนที่เป็นเศษส่วนเป็นลบด้วย
ตัวอย่างเช่น: สำหรับหมายเลข -0,35
ผลตอบแทน
ส่วนจำนวนเต็ม = 0 ส่วนเศษส่วน = -0.35
หากคุณกำลังทำงานกับพิกัด GPS จะเป็นการดีกว่าที่จะให้ผลลัพธ์กับเครื่องหมายในส่วนจำนวนเต็มเป็น:
ส่วนจำนวนเต็ม = -0 ส่วนเศษส่วน = 0.35
ตัวเลขเหล่านี้ใช้สำหรับพิกัด GPS ซึ่งเป็นสัญญาณสำคัญสำหรับตำแหน่ง Lat หรือ Long
เสนอรหัส:
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
อ้างอิง:
ฉันจะใช้ BigDecimal สำหรับการแก้ปัญหา แบบนี้:
double value = 3.25;
BigDecimal wholeValue = BigDecimal.valueOf(value).setScale(0, BigDecimal.ROUND_DOWN);
double fractionalValue = value - wholeValue.doubleValue();
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
ตกลงนี่อาจจะสายไป แต่ฉันคิดว่าแนวทางที่ดีที่สุดและแม่นยำกว่าคือการใช้ 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%! และแม่นยำไม่ทำให้เข้าใจผิด!
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);
}
}