java小数点后几位截断操作
最近在代码编写中使用到了浮点数,只需要保留小数点后两位。
在网上搜索到了好几种方式,测试了一下性能。
真有必要纠结浮点计算引入的性能问题吗?
已知问题:简单的截取操作是没有实现四舍五入、向上取整这些特性的。
/**
* Benchmark Mode Cnt Score Error Units
* BigDecimalTester.baseline avgt 0.299 ns/op
* BigDecimalTester.test avgt 1722.988 ns/op
* BigDecimalTester.test2 avgt 1112.921 ns/op
* BigDecimalTester.test3 avgt 3.041 ns/op
*
* @author oops
*/
public class BigDecimalTester {
static DecimalFormat format = new DecimalFormat("#.000");
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void baseline() { }
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public double test() {
double d = 1.0015;
BigDecimal decimal = new BigDecimal(d);
decimal.setScale(3, BigDecimal.ROUND_HALF_UP);
return decimal.doubleValue();
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public double test2() {
double d = 1.0015;
DecimalFormat format = new DecimalFormat("#.000");
String str = format.format(d);
return Double.parseDouble(str);
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public double test3() {
double d = 1.0015;
d = ((int) (d * 1000)) / 1000.0;
return d;
}
public static void main(String[] args) {
BigDecimalTester tester = new BigDecimalTester();
double d = tester.test3();
System.out.println(d);
}
}