Làm cách nào để lấy toàn bộ và các phần phân đoạn từ gấp đôi trong JSP / Java? Nếu giá trị là 3,25 thì tôi muốn lấy fractional =.25
,whole = 3
Làm thế nào chúng ta có thể làm điều này trong Java?
Làm cách nào để lấy toàn bộ và các phần phân đoạn từ gấp đôi trong JSP / Java? Nếu giá trị là 3,25 thì tôi muốn lấy fractional =.25
,whole = 3
Làm thế nào chúng ta có thể làm điều này trong Java?
Câu trả lời:
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);
Kết quả đầu ra:
Integer part = 2
Fractional part = 0.2999999999999998
2.3
, nhưng chắc chắn là không 2.3
. Và không có gì sai với đầu ra, trừ khi bạn muốn nhiều hơn 10 chữ số hợp lệ. Tất cả những gì bạn cần là làm tròn số trong mỗi đầu ra (ví dụ: định dạng %.9f
) thường ít gây đau hơn BigDecimal
. Vấn đề duy nhất ở đây là tràn.
(long)1.0e100
bạn sẽ nhận được 0. Rất nhiều lần bạn cần giá trị gấp đôi chỉ đơn giản là "floored" mà có floor()
. Nếu bạn muốn sử dụng cả hai phần tích phân và phân số modf()
. Thực sự, đây là một câu trả lời tồi.
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
nghĩa là modulo ( -3.25 % 1 == 0.75
) và những ngôn ngữ khác, chẳng hạn như Java, Fortran, C và C ++, sử dụng %
nghĩa là phần dư ( -3.25 % 1 == -0.25
). WindRider có thể đã nhập nó vào Python REPL để có tính hiệu quả, nhưng câu trả lời đó gây hiểu lầm vì câu hỏi này là về JVM.
Vì câu hỏi 1 năm tuổi này được khởi động bởi một người đã sửa chủ đề câu hỏi, và câu hỏi này đã được gắn thẻ jspvà không ai ở đây có thể đưa ra câu trả lời nhắm mục tiêu JSP, đây là đóng góp nhắm mục tiêu JSP của tôi.
Sử dụng JSTL (chỉ cần thả jstl-1.2.jar vào /WEB-INF/lib
) fmt taglib. Có một <fmt:formatNumber>
thẻ thực hiện chính xác những gì bạn muốn và theo cách khá dễ dàng với sự trợ giúp của maxFractionDigits
và maxIntegerDigits
thuộc tính.
Đây là một SSCCE , chỉ cần copy'n'paste'n'run 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>
Đầu ra:
Toàn bộ: 3
Phân số: 0,25
Đó là nó. Không cần phải xoa bóp nó với sự trợ giúp của mã Java thô.
Câu hỏi ban đầu yêu cầu phần lũy thừa và phần định trị, thay vì phần phân số và phần nguyên.
Để lấy số mũ và phần định trị từ một nhân đôi, bạn có thể chuyển đổi nó thành biểu diễn IEEE 754 và trích xuất các bit như sau:
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
Logic chính trước tiên bạn phải tìm xem có bao nhiêu chữ số sau dấu thập phân.
Mã này hoạt động cho bất kỳ số nào có tối đa 16 chữ số. Nếu bạn sử dụng BigDecimal, bạn có thể chạy nó chỉ với tối đa 18 chữ số. đặt giá trị đầu vào (số của bạn) vào biến "num", đây là một ví dụ tôi đã mã hóa nó.
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);
Phần định trị và số mũ của một số dấu chấm động kép IEEE là các giá trị sao cho
value = sign * (1 + mantissa) * pow(2, exponent)
nếu phần định trị có dạng 0.101010101_base 2 (nghĩa là bit quan trọng nhất của nó được chuyển sang sau điểm nhị phân) và số mũ được điều chỉnh theo độ chệch.
Kể từ 1.6, java.lang.Math cũng cung cấp một phương thức trực tiếp để lấy số mũ không chệch (được gọi là getExponent (double))
Tuy nhiên, những con số bạn đang yêu cầu là phần tích phân và phần thập phân của số, có thể lấy được bằng cách sử dụng
integral = Math.floor(x)
fractional = x - Math.floor(x)
mặc dù bạn có thể muốn đối xử với số âm theo cách khác (floor(-3.5) == -4.0)
, tùy thuộc vào lý do tại sao bạn muốn hai phần.
Tôi thực sự khuyên bạn không nên gọi những phần định trị và số mũ này.
[Chỉnh sửa: Câu hỏi ban đầu hỏi cách lấy phần định trị và số mũ.]
Trong đó n là số nhận phần định trị / số mũ thực:
exponent = int(log(n))
mantissa = n / 10^exponent
Hoặc, để nhận được câu trả lời bạn đang tìm kiếm:
exponent = int(n)
mantissa = n - exponent
Đây không phải là Java chính xác nhưng nên dễ dàng chuyển đổi.
Phần số nguyên nhận được từ quá trình ép đơn giản và để tách phân số - chuỗi:
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
Nếu số của bạn là 2.39999999999999 thì sao. Tôi cho rằng bạn muốn lấy giá trị thập phân chính xác. Sau đó, sử dụng 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);
Vì fmt:formatNumber
thẻ không phải lúc nào cũng mang lại kết quả chính xác, đây là một cách tiếp cận khác chỉ dành cho JSP: Nó chỉ định dạng số dưới dạng chuỗi và thực hiện phần còn lại của tính toán trên chuỗi, vì điều đó dễ dàng hơn và không liên quan đến dấu phẩy động nữa số học.
<%@ 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
làm tròn đối số của nó, điều này không được mong muốn trong trường hợp này.
Câu trả lời được chấp nhận không hoạt động tốt đối với các số âm trong khoảng từ -0 đến -1.0 Đồng thời cung cấp cho phần phân số âm.
Ví dụ: Cho số -0,35
trả lại
Phần nguyên = 0 Phần thập phân = -0,35
Nếu bạn đang làm việc với tọa độ GPS, tốt hơn nên có kết quả với dấu hiệu trên phần nguyên là:
Phần nguyên = -0 Phần thập phân = 0,35
Các số của luận án được sử dụng chẳng hạn cho tọa độ GPS, đâu là dấu hiệu quan trọng cho vị trí Vĩ độ hoặc Kinh độ
Đề xuất mã:
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));
Đầu ra:
Integer part = -0
Fractional part = 0,3500
Kể từ Java 8, bạn có thể sử dụng Math.floorDiv
.
Nó trả về giá trị lớn nhất (gần nhất với dương vô cùng) int
nhỏ hơn hoặc bằng thương đại số.
Vài ví dụ:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
Ngoài ra, /
có thể sử dụng toán tử:
(4 / 3) == 1
(-4 / 3) == -1
Người giới thiệu:
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
OK, điều này có thể muộn, nhưng tôi nghĩ cách tiếp cận tốt nhất và chính xác hơn là sử dụng 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
chúng ta đang nói về đầu vào và đầu ra, bạn hãy đặt giá trị và nhận lại giá trị của bạn mà không mất 0,001%! và điều này chính xác, không gây hiểu lầm!
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);
}
}