我想在float(或double)中设置指定的小数位数,使用此形式的方法
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
等
答案 0 :(得分:3)
使用此
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)
如果你只是一个格式可视化问题,你也可以使用String并不重要浮点变量没有小数位,所以这是另一个有效的方法:
public String decimalDigits(int decimaldigits, float x){
final NumberFormat numFormat = NumberFormat.getNumberInstance();
numFormat.setMaximumFractionDigits(decimaldigits);
final String resultS = numFormat.format(x);
return resultS;
}
如果有人对此解决方案的有效性有疑问,应该询问详细信息或尝试编译代码并在downvote之前对其进行测试,谢谢。代码经过测试,就像魅力一样。
警告强>
显然你必须传递 float ,因为该方法使用 Float.parseFloat ,如果你想传递 double ,你必须使用在方法中传递之前强制转换为float,否则你必须更改所有方法原语并从float解析为double。 Double和float是不同的。
答案 1 :(得分:0)
返回float
或double
的例程不可能返回正确的舍入值,例如36.59或36.6,因为这些值在二进制浮点中无法表示。二进制浮点只能返回接近的值,例如36.60000000000000142108547152020037174224853515625。二进制浮点中没有位模式表示值36.6。
如果需要十进制值,则必须使用十进制基数,例如DecimalFormat或BigDecimal。
答案 2 :(得分:-1)
可能的伪代码如下:
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));
}
}