我怎样才能截断在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);
检查可用的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
首先注意一个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(或类似的),然后格式化它。