我怎样才能截断在Java中的双精度到只有两位小数?

例如,我有variables3.545555555,我想截断到3.54。

如果你想要显示,使用java.text.DecimalFormat

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

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

  Math.floor(value * 100) / 100; 
 DecimalFormat df = new DecimalFormat(fmt); df.setRoundingMode(RoundingMode.DOWN); s = df.format(d); 

检查可用的RoundingModeDecimalFormat

位老论坛,上述答案没有正面和负面的价值观(我的意思是计算,只是没有舍入做截断)。 从如何在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 

首先注意一个double是一个二进制小数,并没有真正的小数位。

如果您需要小数位,请使用BigDecimal (其中包含用于截断的setScale()方法setScale() ,或者使用DecimalFormat来获取String

如果出于任何原因,你不想使用BigDecimal你可以把你的double为一个int来截断它。

如果你想截断到这个地方:

  • 简单地转换为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就是你希望去的地方的数量,所以1会decimalPlaces 十分之一 ,二百分之一 ,等等(0轮到那个地方,负一个到十几等)

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

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

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

  DecimalFormat df = new DecimalFormat("#.##"); df.setRoundingMode(RoundingMode.FLOOR); double result = new Double(df.format(3.545555555); 

这会给= 3.54!

格式化为一个string,并将其转换回双倍我认为会给你你想要的结果。

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

快速修复它可能是:

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

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

这里是我使用的方法:

 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 roundTwoDecimals(double d) { DecimalFormat twoDForm = new DecimalFormat("#.##"); return Double.valueOf(twoDForm.format(d)); } 

快速检查是使用Math.floor方法。 我创build了一个方法来检查下面的两个或更less的小数点的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; } 
 //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 

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

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

 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 

这对我工作:

 double input = 104.8695412 //For example long roundedInt = Math.round(input * 100); double result = (double) roundedInt/100; //result == 104.87 

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