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

时间:2011-10-12 22:46:26

标签: java double truncate decimalformat

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

16 个答案:

答案 0 :(得分:114)

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

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

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

 Math.floor(value * 100) / 100;

答案 1 :(得分:39)

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

选中RoundingModeDecimalFormat

答案 2 :(得分:15)

Bit Old Forum,上述答案都没有适用于正值和负值(我的意思是计算,只是在没有舍入的情况下进行截断)。 来自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));

结果:

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00

答案 3 :(得分:8)

首先请注意,double是一个二进制小数,并且 小数位。

如果您需要小数位,请使用BigDecimal,其setScale()方法可截断,或使用DecimalFormat获取String

答案 4 :(得分:6)

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

如果要截断到 Ones 的地方:

  • 只需投放到int

Tenths 的地方:

  • 乘以10
  • 施放到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轮到 1个位置,负数到10个等等)

答案 5 :(得分:4)

也许Math.floor(value * 100) / 100?请注意,3.54等值可能无法用double完全表示。

答案 6 :(得分:3)

您可以使用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

答案 7 :(得分:2)

3.545555555获得3.54。 请尝试以下内容:

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

    df.setRoundingMode(RoundingMode.FLOOR);

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

这将给出= 3.54!

答案 8 :(得分:2)

以下是我使用的方法:

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;

答案 9 :(得分:2)

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

double值不是round(),floor()或ceil()。

快速修复它可能是:

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

您可以将sValue用于显示目的,或使用newValue进行计算。

答案 10 :(得分:0)

可能跟随:

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

 builder.<Keytype, ValueType>stream(YourInputTopic))
    .map()
    .groupByKey()
    .windowedBy(TimeWindows.of(Duration.ofSeconds(10))) // This may or may not be required 
                                                           in your case
    .count()
    .toStream()
    .map((Windowed<String> key, Long count) -> new KeyValue<>(key.key(),count.toString()))
    .filter((k,v)-> Long.parseLong(v) > 20) // This is the filter
    .to(TopicName));

答案 13 :(得分:-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

答案 14 :(得分:-1)

这对我有用:

double input = 104.8695412  //For example

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

//result == 104.87

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

答案 15 :(得分:-1)

//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

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