例如,我有一个变量3.545555555,我想截取为3.54。
如果您想要用于显示的目的,请使用java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
如果需要进行计算,请使用java.lang.Math
:
Math.floor(value * 100) / 100;
floor
函数仅适用于正数的截断。 - DevDecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
查看可用的RoundingMode
和DecimalFormat
。
其他答案都无法适用于正负值(我的意思是进行计算和只截断而不四舍五入),且不需要转换为字符串。
来自如何在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
String.valueOf(x)
,否则在例如2.28、9.62或9411.3上它会工作不正确。 - Dima Korobskiy将其格式化为字符串,再转换回double类型,我觉得这样可以得到您想要的结果。
double值不会使用round()、floor()或ceil()进行处理。
一个快速的解决方法可能是:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
首先要注意,double
是一个二进制小数,实际上并没有十进制位。
如果你需要十进制位,可以使用BigDecimal
,它有一个setScale()
方法用于截断,或者使用DecimalFormat
获得一个String
。
BigDecimal
,您可以将您的 double
强制转换为 int
以截断它。int
如果要截断到十分位:int
- 再次转换为 double
- 并除以十。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表示四舍五入到整数位,-1表示四舍五入到十位,以此类推)。// 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
nf.setMinimumFractionDigits(2)
; - Amir Dora.将3.545555555变为3.54。 尝试以下方法:
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.FLOOR);
double result = new Double(df.format(3.545555555);
这将会得到 3.54!
我使用了 Math.floor() 方法和基本的小数移位(100 = 2)。
//3.545555555 to 3.54 by floor method
double x = 3.545555555;
double y = Math.floor(x * 100); //354
double z = y / 100; //3.54
Math.floor(value * 100) / 100
?需要注意的是,像3.54
这样的值可能无法准确表示为一个double
类型。double value = 9411.3;
System.out.println(Math.floor(value * 100) / 100);
// 9411.29
- Dima Korobskiydouble value = 2.28;
时,实际上 value
的值是 2.279999999999999804600747665972448885440826416015625
,因此在截断后你会得到一个诚实的 2.27
。从我的角度来看,问题不在于截断,而在于赋值。 - Vladassert(2.28.trunc(2)) == 2.28
,其中 trunc(precision)
是一种截断方法。例如,请参见此博客文章(不是我的):https://blog.mrhaki.com/2010/01/groovy-goodness-round-and-truncate.html - Dima Korobskiy