可能重复:
如何在Java 中将数字四舍五入到小数点后n位
我想用这种形式的方法在浮点(或双精度(中设置指定数量的十进制数字
public float decimalDigits(int x, float n){
....
}
例如
->如果我有
float n1=36.58529
线路
float n2=decimalDigits(2, n1);
应返回
n2=36.59
->如果n1为:
float n1=36.58329
线路
float n2=decimalDigits(2, n1);
应返回
n2=36.58
线路
float n2=decimalDigits(1, n2);
应返回
n2=36.6
etc
使用此
public float decimalDigits(int decimaldigits, float x){
final NumberFormat numFormat = NumberFormat.getNumberInstance();
numFormat.setMaximumFractionDigits(decimaldigits);
final String resultS = numFormat.format(x);
String parsable=resultS.replace(".", "");
parsable=resultS.replace(",", ".");
float ris=Float.parseFloat(parsable);
return ris;
}
我已经在代码中添加了字符串替换,以避免点约定引起的解析问题(例如1234.34在格式化后变成1.234,34,导致float中的重分析错误(
如果你的只是一个格式可视化问题,你也可以使用字符串,并且浮点变量没有小数点也没关系,所以这是另一个有效的方法:
public String decimalDigits(int decimaldigits, float x){
final NumberFormat numFormat = NumberFormat.getNumberInstance();
numFormat.setMaximumFractionDigits(decimaldigits);
final String resultS = numFormat.format(x);
return resultS;
}
如果有人对这个解决方案的有效性有疑问,应该询问详细信息,或者在否决之前尝试编译代码并进行测试,谢谢。该代码经过了测试,运行起来很有魅力
警告
很明显,您必须传递float,因为该方法使用float.parseFloat。如果您想传递double则必须在将其传递到方法中之前使用强制转换以使其浮动,否则您必须更改所有方法基元并从float解析为double。Double和float是不同的。
返回float
或double
的例程不可能返回正确的四舍五入值,如36.59或36.6,因为这些值不能用二进制浮点表示。二进制浮点只能返回接近的值,例如36.60000000000000142108547152020037174224853515625。二进制浮点中没有表示值36.6的位模式。
如果需要十进制值,则必须使用十进制基数,如DecimalFormat或BigDecimal。
可能的伪代码如下:
public class test {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(decimalDigits(10.09872, 4));
}
static double decimalDigits(double value, int n)
{
double decimal = value - ((int) value);
System.out.println(decimal);
double short_decimal = 0;
for(int i = 0; i < n; i++)
{
/* current digit on decimal */
decimal = decimal * 10;
System.out.println(decimal);
short_decimal += (Math.pow(10, n - i - 1) * (int)decimal);
/* find further */
decimal = decimal - (int)decimal;
}
return (int)value + (double)(short_decimal / Math.pow(10, n));
}
}