Ví dụ: tôi có biến 3.545555555, tôi muốn cắt bớt biến chỉ còn 3.54.
Ví dụ: tôi có biến 3.545555555, tôi muốn cắt bớt biến chỉ còn 3.54.
Câu trả lời:
Nếu bạn muốn điều đó cho mục đích hiển thị, hãy sử dụng java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
Nếu bạn cần nó để tính toán, hãy sử dụng java.lang.Math
:
Math.floor(value * 100) / 100;
floor
để cắt ngắn chỉ hoạt động đối với các giá trị dương.
RoundingMode.DOWN
như RoudingMode.FLOOR
luôn vòng về phía vô cực âm.
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Kiểm tra có sẵn RoundingMode
và DecimalFormat
.
DOWN
đó thực sự có tác dụng cắt bớt cho cả số dương và số âm. Như đã thấy trong bảng ví dụ trong tài liệu .
Bit Old Forum, Không có câu trả lời nào ở trên phù hợp với cả giá trị âm và dương (ý tôi là đối với phép tính và chỉ để thực hiện cắt ngắn mà không làm tròn). Từ Làm thế nào để làm tròn một số đến những nơi n chữ số thập phân trong Java liên kết
private static BigDecimal truncateDecimal(double x,int numberofDecimals)
{
if ( x > 0) {
return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);
} else {
return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);
}
}
Phương pháp này làm việc tốt cho tôi.
System.out.println(truncateDecimal(0, 2));
System.out.println(truncateDecimal(9.62, 2));
System.out.println(truncateDecimal(9.621, 2));
System.out.println(truncateDecimal(9.629, 2));
System.out.println(truncateDecimal(9.625, 2));
System.out.println(truncateDecimal(9.999, 2));
System.out.println(truncateDecimal(-9.999, 2));
System.out.println(truncateDecimal(-9.0, 2));
Các kết quả :
0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
Trước tiên, hãy lưu ý rằng a double
là một phân số nhị phân và không thực sự có chữ số thập phân.
Nếu bạn cần vị trí thập phân, hãy sử dụng a BigDecimal
, có một setScale()
phương thức để cắt ngắn hoặc sử dụng DecimalFormat
để lấy a String
.
Nếu vì bất cứ lý do gì, bạn không muốn sử dụng, BigDecimal
bạn có thể double
chuyểnint
để cắt ngắn nó.
Nếu bạn muốn cắt ngắn đến vị trí của Ones :
int
Đến vị trí thứ mười :
int
double
Địa điểm Hundreths
Thí dụ:
static double truncateTo( double unroundedNumber, int decimalPlaces ){
int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) );
double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) );
return truncatedNumber;
}
Trong ví dụ này, decimalPlaces
sẽ là số nơi QUÁ KHỨ những nơi bạn muốn đi, vì vậy 1 sẽ tròn đến phần mười chỗ, 2 đến trăm , và vân vân (0 vòng đến những nơi, và một tiêu cực đến hàng chục , Vân vân.)
unroundedNumber
đủ lớn. Nó có thể phù hợp với ví dụ trong câu hỏi, nhưng một giải pháp chung sẽ phù hợp với bất kỳ giải pháp nào double
.
Định dạng dưới dạng một chuỗi và chuyển đổi trở lại thành đôi, tôi nghĩ sẽ mang lại cho bạn kết quả bạn muốn.
Giá trị kép sẽ không tròn (), floor () hoặc ceil ().
Một cách khắc phục nhanh chóng cho nó có thể là:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
Bạn có thể sử dụng sValue cho mục đích hiển thị hoặc newValue để tính toán.
Bạn có thể sử dụng đối tượng Lớp NumberFormat để hoàn thành nhiệm vụ.
// Creating number format object to set 2 places after decimal point
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
nf.setGroupingUsed(false);
System.out.println(nf.format(precision));// Assuming precision is a double type variable
3.545555555 để có được 3.54. Hãy thử theo dõi điều này:
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.FLOOR);
double result = new Double(df.format(3.545555555);
Điều này sẽ cho = 3,54!
Đây là phương pháp tôi sử dụng:
double a=3.545555555; // just assigning your decimal to a variable
a=a*100; // this sets a to 354.555555
a=Math.floor(a); // this sets a to 354
a=a/100; // this sets a to 3.54 and thus removing all your 5's
Điều này cũng có thể được thực hiện:
a=Math.floor(a*100) / 100;
Có thể sau:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
Kiểm tra nhanh là sử dụng phương pháp Math.floor. Tôi đã tạo một phương pháp để kiểm tra một nhân đôi cho hai hoặc ít chữ số thập phân dưới đây:
public boolean checkTwoDecimalPlaces(double valueToCheck) {
// Get two decimal value of input valueToCheck
double twoDecimalValue = Math.floor(valueToCheck * 100) / 100;
// Return true if the twoDecimalValue is the same as valueToCheck else return false
return twoDecimalValue == valueToCheck;
}
Tôi có một phiên bản sửa đổi một chút của Mani .
private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) {
return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN);
}
public static void main(String[] args) {
System.out.println(truncateDecimal(0, 2));
System.out.println(truncateDecimal(9.62, 2));
System.out.println(truncateDecimal(9.621, 2));
System.out.println(truncateDecimal(9.629, 2));
System.out.println(truncateDecimal(9.625, 2));
System.out.println(truncateDecimal(9.999, 2));
System.out.println(truncateDecimal(3.545555555, 2));
System.out.println(truncateDecimal(9.0, 2));
System.out.println(truncateDecimal(-9.62, 2));
System.out.println(truncateDecimal(-9.621, 2));
System.out.println(truncateDecimal(-9.629, 2));
System.out.println(truncateDecimal(-9.625, 2));
System.out.println(truncateDecimal(-9.999, 2));
System.out.println(truncateDecimal(-9.0, 2));
System.out.println(truncateDecimal(-3.545555555, 2));
}
Đầu ra:
0.00
9.62
9.62
9.62
9.62
9.99
9.00
3.54
-9.62
-9.62
-9.62
-9.62
-9.99
-9.00
-3.54
Điều này đã làm việc cho tôi:
double input = 104.8695412 //For example
long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;
//result == 104.87
Cá nhân tôi thích phiên bản này vì nó thực sự thực hiện làm tròn số, thay vì chuyển đổi nó thành Chuỗi (hoặc tương tự) và sau đó định dạng nó.
//if double_v is 3.545555555
String string_v= String.valueOf(double_v);
int pointer_pos = average.indexOf('.');//we find the position of '.'
string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form
double_v = Double.valueOf(string_v);//well this is the final result
điều này có thể hơi khó xử nhưng tôi nghĩ nó có thể giải quyết được vấn đề của bạn :)