如何在 Java 中将一个 double 截断为只有两个小数位?

例如,我有一个变量3.545555555,我希望将其截断为3.54。

366036 次浏览

如果您希望将其用于显示目的,请使用 java.text.DecimalFormat:

 new DecimalFormat("#.##").format(dblVar);

如果计算时需要它,请使用 java.lang.Math:

 Math.floor(value * 100) / 100;

也许是 Math.floor(value * 100) / 100? 请注意,像 3.54这样的值可能不能完全用 double来表示。

也许是这样:

double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}

Note first that a double is a binary fraction and does not really decimal places.

If you need decimal places, use a BigDecimal, which has a setScale() method for truncation, or use DecimalFormat to get a String.

可以使用 NumberFormat 类对象来完成任务。

// 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
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

检查可用的 RoundingModeDecimalFormat

没有其他的答案同时适用于正值和负值(我的意思是计算,只是做“截断”没有舍入)。没有转换成字符串。

How to round a number to n decimal places in Java链接

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));

Results :

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00

我有一个稍微修改过的 摩尼版本。

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

如果由于某种原因,您不想使用 BigDecimal,您可以将 double转换为 int来截断它。

如果你想截断到 一个的位置:

  • 简单地转换成 int

十分之一的地方:

  • 乘以十
  • 转到 int
  • 回到 double
  • 除以十。

地点

  • 乘以和除以100等等。

Example:

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;
}

In this example, decimalPlaces would be the number of places PAST the ones place you wish to go, so 1 would round to the 十分之一 place, 2 to the hundredths, and so on (0 rounds to the 一个 place, and negative one to the tens, etc.)

快速检查是使用 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;
}

3.545555555 to get 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 input = 104.8695412  //For example


long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;


//result == 104.87

我个人喜欢这个版本,因为它实际上是在数字上进行舍入,而不是将其转换为 String (或类似的)然后格式化它。

格式化为一个字符串,并转换回双我认为将给你的结果,你想要的。

双重值不是 round ()、 floor ()或 ceil ()。

A quick fix for it could be:

 String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);

可以使用 sValue 进行显示,也可以使用 newValue 进行计算。

      double value = 3.4555;
String value1 =  String.format("% .3f", value) ;
String value2 = value1.substring(0, value1.length() - 1);
System.out.println(value2);
double doublevalue= Double.valueOf(value2);
System.out.println(doublevalue);

我使用了 Math.floor ()方法和(100 = 2)小数位的基本移动。

//3.545555555 to 3.54 by floor method
double x = 3.545555555;
double y = Math.floor(x * 100); //354
double z = y / 100; //3.54

Double firstValue = -3.1756 d;

Double value1 = (((int)(Math.pow (10,3) * firstValue))/Math.pow (10,3)) ;

在这个解决方案中,这将 截肢一个双精度到只有两个小数位。这个解决方案将 不是圆的的双精度值。

double myDoubleNumber = 3.545555555;
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.DOWN);
double myDoubleNumberTruncated = Double.parseDouble(df.format(myDoubleNumber));
System.out.println(myDoubleNumberTruncated);

这将输出 3.54

DecimalFormat (”# 。在这里,我在小数点后面输入了两个哈希符号(# #)。因此,这会将数字截断到小数点后两位。

这对正面和负面的价值观都有效。