Boz*_*zho 125

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

 new DecimalFormat("#.##").format(dblVar);
Run Code Online (Sandbox Code Playgroud)

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

 Math.floor(value * 100) / 100;
Run Code Online (Sandbox Code Playgroud)

  • 这将****不显示截断的3.545555555到3.54,但舍入到3.55.DecimalFormat.setRoundingMode()需要设置为RoundingMode.FLOOR; (43认同)
  • 这对我不起作用Math.floor(9.62*100)/ 100给出了9.61 (6认同)
  • 使用`floor`截断仅适用于正值. (4认同)
  • @ChristianGarcíaTruncation正确完成了`RoundingMode.DOWN`,因为`RoudingMode.FLOOR`总是向负无穷大舍入. (3认同)

小智 42

DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Run Code Online (Sandbox Code Playgroud)

检查可用RoundingModeDecimalFormat.

  • @BasilBourque RoundingMode.DOWN是截断.与错误推荐楼层功能的其他答案(楼层仅截断正数)相比,这对正值和负值都能正常工作. (5认同)
  • @Dev 我纠正了。现在我发现“DOWN”确实对正数和负数都有截断的作用。如[文档](https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html)中的示例表所示。 (2认同)

Man*_*ani 18

Bit Old Forum,上述答案都没有适用于正值和负值(我的意思是计算,只是在没有舍入的情况下进行截断).从如何将数字舍入到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法对我来说很好.

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));
Run Code Online (Sandbox Code Playgroud)

结果:

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
Run Code Online (Sandbox Code Playgroud)

  • return new BigDecimal(x).setScale(numberofDecimals, RoundingMode.DOWN).doubleValue(); (2认同)

Mic*_*rdt 8

首先请注意a double是二进制小数,并且实际上没有小数位.

如果你需要小数位,请使用a BigDecimal,它有一个setScale()截断方法,或者DecimalFormat用来得到一个String.


小智 7

无论出于何种原因,如果您不想使用a,BigDecimal您可以将double其转换int为截断它.

如果要截断到Ones位置:

  • 简单地投了 int

十分之一:

  • 乘以十
  • 演员 int
  • 投回去 double
  • 除以十.

Hundreths的地方

  • 乘以除以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;
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,decimalPlaces将是你希望去的地方PAST的数量,所以1会绕到十分位置,2到百分之一,依此类推(0 轮到那些地方,负数到数十呢)等)

  • 这是一个“糟糕”的通用解决方案。如果`unroundedNumber`足够大,则乘法和强制转换都将最终丢弃数据并产生有效的随机数。它可能适用于问题中的示例,但一般的解决方案应适用于任何“双精度”。 (2认同)

Rus*_*ams 6

您可以使用 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
Run Code Online (Sandbox Code Playgroud)


Jao*_*ssy 6

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

double 值不会是 round()、floor() 或 ceil()。

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

 String sValue = (String) String.format("%.2f", oldValue);
 Double newValue = Double.parseDouble(sValue);
Run Code Online (Sandbox Code Playgroud)

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


Ank*_*h G 5

3.545555555 得到 3.54。为此尝试以下操作:

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

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);
Run Code Online (Sandbox Code Playgroud)

这将给出 = 3.54!