对于简单的浮点数截断,使用 DecimalFormat 是否过多?
Is using DecimalFormat too much for simple float truncation?
我突然需要从浮点数中删除多余的数字,所以我查看了工具箱,发现 DecimalFormat
可用。
尽管创建一个新对象只是为了从一个数字中删除一些额外的数字似乎相当昂贵,所以我拼凑了一个小程序来测试它。
public class Snippet {
static float unformatted = -542.347543274623876F;
static int fractionDigits = 2;
public static void main(String[] args){
long a = System.nanoTime();
System.out.println(stringMethod(unformatted));
long b = System.nanoTime();
System.out.println(formatMethod(unformatted));
long c = System.nanoTime();
System.out.println(stringMethod2(unformatted));
long d = System.nanoTime();
System.out.println("OP1:"+(b-a));
System.out.println("OP2:"+(c-b));
System.out.println("OP3:"+(d-c));
}
private static float stringMethod(float number){
String unfStr = String.valueOf(number);
for(int i=0;i<unfStr.length();i++){
if(unfStr.charAt(i) == '.'){
return Float.parseFloat(unfStr.substring(0, i+1+fractionDigits));
}
}
return Float.parseFloat(unfStr);
}
private static float stringMethod2(float number){
String unfStr = String.format("%."+(fractionDigits+1)+"f",number);
return Float.parseFloat(unfStr.substring(0,unfStr.length()-1));
}
private static float formatMethod(float number){
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(fractionDigits);
df.setRoundingMode(RoundingMode.DOWN);
return Float.parseFloat(df.format(unformatted));
}
}
输出:
-542.34
-542.34
-542.34
OP1:1937181
OP2:32609426
OP3:3111908
不管我运行多少次,DecimalFormat
方法就是跟不上。
所以我想这里的问题是,是否有任何理由(除了代码可读性之外)使用 DecimalFormat
而不是为简单的 float t运行cation 创建自己的方法?
这是一种计算方法:
double d = -542.347543274623876;
System.out.println(d);
int n = 2; // decimal digits
double p = Math.pow(10,n);
d = Math.floor((int)(p*d))/p;
System.out.println(d);
在这里试试:http://ideone.com/wIhBpL
它的作用是,将它乘以您想要的小数位数的 10 倍,将其转换为整数(切掉剩余的数字),然后通过除以 10 将其转换回小数小数位数。它也应该适用于 float
,如果你改用它的话。
我突然需要从浮点数中删除多余的数字,所以我查看了工具箱,发现 DecimalFormat
可用。
尽管创建一个新对象只是为了从一个数字中删除一些额外的数字似乎相当昂贵,所以我拼凑了一个小程序来测试它。
public class Snippet {
static float unformatted = -542.347543274623876F;
static int fractionDigits = 2;
public static void main(String[] args){
long a = System.nanoTime();
System.out.println(stringMethod(unformatted));
long b = System.nanoTime();
System.out.println(formatMethod(unformatted));
long c = System.nanoTime();
System.out.println(stringMethod2(unformatted));
long d = System.nanoTime();
System.out.println("OP1:"+(b-a));
System.out.println("OP2:"+(c-b));
System.out.println("OP3:"+(d-c));
}
private static float stringMethod(float number){
String unfStr = String.valueOf(number);
for(int i=0;i<unfStr.length();i++){
if(unfStr.charAt(i) == '.'){
return Float.parseFloat(unfStr.substring(0, i+1+fractionDigits));
}
}
return Float.parseFloat(unfStr);
}
private static float stringMethod2(float number){
String unfStr = String.format("%."+(fractionDigits+1)+"f",number);
return Float.parseFloat(unfStr.substring(0,unfStr.length()-1));
}
private static float formatMethod(float number){
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(fractionDigits);
df.setRoundingMode(RoundingMode.DOWN);
return Float.parseFloat(df.format(unformatted));
}
}
输出:
-542.34
-542.34
-542.34
OP1:1937181
OP2:32609426
OP3:3111908
不管我运行多少次,DecimalFormat
方法就是跟不上。
所以我想这里的问题是,是否有任何理由(除了代码可读性之外)使用 DecimalFormat
而不是为简单的 float t运行cation 创建自己的方法?
这是一种计算方法:
double d = -542.347543274623876;
System.out.println(d);
int n = 2; // decimal digits
double p = Math.pow(10,n);
d = Math.floor((int)(p*d))/p;
System.out.println(d);
在这里试试:http://ideone.com/wIhBpL
它的作用是,将它乘以您想要的小数位数的 10 倍,将其转换为整数(切掉剩余的数字),然后通过除以 10 将其转换回小数小数位数。它也应该适用于 float
,如果你改用它的话。