ตัวอย่างเช่นฉันมีตัวแปร 3.545555555 ซึ่งฉันต้องการตัดให้เหลือเพียง 3.54
ตัวอย่างเช่นฉันมีตัวแปร 3.545555555 ซึ่งฉันต้องการตัดให้เหลือเพียง 3.54
คำตอบ:
หากคุณต้องการเพื่อการแสดงผลให้ใช้java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
หากคุณต้องการใช้ในการคำนวณให้ใช้java.lang.Math
:
Math.floor(value * 100) / 100;
floor
เพื่อตัดทอนใช้ได้กับค่าบวกเท่านั้น
RoundingMode.DOWN
ให้RoudingMode.FLOOR
ปัดเศษเป็นค่าอนันต์เชิงลบเสมอ
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
ตรวจสอบที่มีอยู่RoundingMode
และDecimalFormat
.
DOWN
มีผลของการตัดทอนจำนวนทั้งบวกและลบ เท่าที่เห็นในตารางตัวอย่างในเอกสาร
Bit Old Forum ไม่มีคำตอบใดที่ใช้ได้กับทั้งค่าบวกและค่าลบ (ฉันหมายถึงการคำนวณและเพียงแค่ตัดทอนโดยไม่ต้องปัดเศษ) จากลิงก์How to round a decimal places to n decimal places in Java link
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);
}
}
วิธีนี้ใช้ได้ผลดีสำหรับฉัน
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));
ผล :
0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
หมายเหตุแรกที่double
เป็นส่วนไบนารีและไม่ได้จริงๆมีตำแหน่งทศนิยม
หากคุณต้องการตำแหน่งทศนิยมให้ใช้ a BigDecimal
ซึ่งมีsetScale()
วิธีการตัดทอนหรือใช้DecimalFormat
เพื่อรับ a String
.
ถ้าด้วยเหตุผลใด ๆ ก็ตามที่คุณไม่ต้องการที่จะใช้BigDecimal
คุณสามารถโยนของคุณdouble
ไปยังint
ที่จะตัดมัน
หากคุณต้องการตัดทอนไปยังตำแหน่งOnes :
int
ไปยังสถานที่ที่สิบ :
int
double
สถานที่Hundreths
ตัวอย่าง:
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;
}
ในตัวอย่างนี้decimalPlaces
จะเป็นจำนวนสถานที่ PAST สถานที่ที่คุณต้องการไปดังนั้น 1 จะปัดเศษเป็นอันดับที่สิบ 2 ถึงที่ร้อยและอื่น ๆ (0 รอบไปยังตำแหน่งที่หนึ่งและลบหนึ่งถึงสิบ ฯลฯ )
unroundedNumber
นั้นมีขนาดใหญ่พอ มันอาจจะทำงานเช่นในคำถาม double
แต่การแก้ปัญหาทั่วไปควรจะทำงานใด ๆ
การจัดรูปแบบเป็นสตริงและการแปลงกลับเป็นสองเท่าฉันคิดว่าจะให้ผลลัพธ์ที่คุณต้องการ
ค่าสองเท่าจะไม่เป็น round (), floor () หรือ ceil ()
การแก้ไขอย่างรวดเร็วอาจเป็น:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
คุณสามารถใช้ sValue เพื่อวัตถุประสงค์ในการแสดงผลหรือค่า newValue สำหรับการคำนวณ
อาจจะMath.floor(value * 100) / 100
? ระวังว่าค่าเช่น3.54
อาจไม่ถูกแทนด้วย a double
.
คุณสามารถใช้ออบเจ็กต์ NumberFormat Class เพื่อทำงานให้สำเร็จ
// 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 จะได้ 3.54 ลองติดตามสิ่งนี้:
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.FLOOR);
double result = new Double(df.format(3.545555555);
สิ่งนี้จะให้ = 3.54!
นี่คือวิธีที่ฉันใช้:
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
สิ่งนี้สามารถทำได้:
a=Math.floor(a*100) / 100;
อาจจะดังต่อไปนี้:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
การตรวจสอบอย่างรวดเร็วคือการใช้เมธอด Math.floor ฉันสร้างวิธีการตรวจสอบสองตำแหน่งสำหรับทศนิยมสองตำแหน่งหรือน้อยกว่าด้านล่าง:
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;
}
ผมมีรุ่นที่ปรับเปลี่ยนเล็กน้อยมณี 's
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));
}
เอาท์พุต:
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
สิ่งนี้ใช้ได้ผลสำหรับฉัน:
double input = 104.8695412 //For example
long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;
//result == 104.87
โดยส่วนตัวแล้วฉันชอบเวอร์ชันนี้เพราะมันทำการปัดเศษเป็นตัวเลขแทนที่จะแปลงเป็นสตริง (หรือคล้ายกัน) แล้วจัดรูปแบบ
//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
มันอาจจะดูอึดอัดเล็กน้อย แต่ฉันคิดว่ามันสามารถแก้ปัญหาของคุณได้ :)