如何在Java中将double缩减为仅两位小数?

How can I truncate a double to only two decimal places in Java?

本问题已经有最佳答案,请猛点这里访问。

例如,我有一个变量3.545555555,我想把它截断为3.54。


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

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

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

1
 Math.floor(value * 100) / 100;


1
2
3
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

检查可用的RoundingModeDecimalFormat


有点老套,上面的答案都不适用于正值和负值(我指的是计算,只是做不舍入的截断)。从Java链接中的数字到小数位数

1
2
3
4
5
6
7
8
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);
    }
}

这种方法对我很管用。

1
2
3
4
5
6
7
8
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));

结果:

1
2
3
4
5
6
7
8
0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00


首先要注意,double是一个二进制小数,实际上没有小数点。

如果需要小数位,可以使用BigDecimal,它有一个setScale()方法进行截断,或者使用DecimalFormat得到一个String


如果出于任何原因,您不想使用BigDecimal,您可以将double强制转换为int来截断它。

如果要截断到一个位置:

  • 简单铸造至int

到十分之一的地方:

  • 乘以十
  • 铸造至int
  • 返回到EDOCX1[4]
  • 除以十。

地方广场

  • 乘以100等。

例子:

1
2
3
4
5
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是您想要去的地方的数量,所以1将四舍五入到十分位,2将百分位,依此类推(0将一位四舍五入,负一将十位四舍五入,等等)。


可能是Math.floor(value * 100) / 100?注意,像3.54这样的值可能不能用double精确表示。


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

1
2
3
4
5
6
// 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

将格式设置为字符串并转换回double,我认为这将为您提供所需的结果。

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

快速修复可能是:

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

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


以下是我使用的方法:

1
2
3
4
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

也可以这样做:

1
a=Math.floor(a*100) / 100;

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

1
2
3
4
5
    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

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

这将得出=3.54!


快速检查是使用math.floor方法。我创建了一个方法来检查下面两个或更少小数位的双精度:

1
2
3
4
5
6
7
8
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;
}


可能如下:

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


1
2
3
4
5
//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

嗯,这可能有点尴尬,但我认为这可以解决你的问题:)


这对我很有用:

1
2
3
4
5
6
double input = 104.8695412  //For example

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

//result == 104.87

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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));

}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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