112

例如,我有变量 3.545555555,我想将其截断为 3.54。

4

15 回答 15

160

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

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

如果您需要它进行计算,请使用java.lang.Math

 Math.floor(value * 100) / 100;
于 2011-10-12T22:47:13.777 回答
46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

检查可用RoundingModeDecimalFormat

于 2013-08-21T10:51:10.133 回答
28

其他答案都不适用于正值和负值(我的意思是计算,只是为了“截断”而不进行舍入)。并且不转换为字符串。

从如何在 Java链接中将数字四舍五入到 n 位小数

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
于 2014-01-30T21:56:04.517 回答
9

首先请注意,adouble是二进制分数,实际上没有小数位。

如果您需要小数位,请使用BigDecimal具有setScale()截断方法的 a ,或用于DecimalFormat获取 a String

于 2011-10-12T22:52:20.543 回答
7

如果出于某种原因,您不想使用 a BigDecimal,则可以将其强制double转换为 anint以截断它。

如果你想截断到Ones 的地方:

  • 简单地投射到int

第十

  • 乘以十
  • 投到int
  • 投回double
  • 并除以十。

  • 乘以除以 100 等。

例子:

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 舍入到位,负一舍入到十位, ETC。)

于 2014-09-18T03:18:58.250 回答
7

格式化为字符串并转换回双精度我认为会给你你想要的结果。

双精度值不会是 round()、floor() 或 ceil()。

一个快速的解决方法可能是:

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

您可以使用 sValue 进行显示或使用 newValue 进行计算。

于 2015-11-27T02:38:09.680 回答
6

您可以使用 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
于 2011-10-13T01:12:30.547 回答
5

3.545555555 得到 3.54。尝试关注这个:

    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);

这将给出= 3.54!

于 2015-01-23T09:49:59.820 回答
2

也许Math.floor(value * 100) / 100?请注意,类似的值3.54可能无法用double.

于 2011-10-12T22:49:25.810 回答
0

也许如下:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  
于 2011-10-12T22:51:37.113 回答
0

快速检查是使用 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;
}
于 2014-10-05T17:18:18.747 回答
0

这是我使用的方法:

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;
于 2015-09-07T17:39:40.787 回答
0
      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);
于 2020-12-31T14:21:47.080 回答
-1

我有一个稍微修改过的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));

}

输出:

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
于 2014-09-11T12:44:50.593 回答
-2

这对我有用:

double input = 104.8695412  //For example

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

//result == 104.87

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

于 2015-11-14T07:06:01.397 回答