gpt4 book ai didi

java - 对于简单的浮点截断来说,使用 DecimalFormat 是否太多了?

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:21 25 4
gpt4 key购买 nike

我突然需要去掉 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 而不是创建自己的简单浮点截断方法?

最佳答案

这是一种数字方法:

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

关于java - 对于简单的浮点截断来说,使用 DecimalFormat 是否太多了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com