我想截断Java中的浮点数,直到两个第一个非零十进制数字。例如,0.000134
至0.00013
或11.00401
至11.0040
。将浮点数截断为两个第一个非零十进制数字
我能想到的唯一解决方案是去掉整数部分,然后乘以10,直到得到一个大于或等于10的数字。然后将原始浮点数截至number of multiplications
十进制数字。
但我可能不得不经常这样做,所以我正在寻找更快的解决方案。
我的测试代码:
public static String truncateTo2NonZero(double f) {
int integral = (int)f;
double decimal = f - integral;
int digits = 0;
while (decimal < 10) {
decimal *= 10;
digits++;
}
double ret = (int)decimal/Math.pow(10, digits);
ret += integral;
return Double.toString(ret);
}
public static void main(String args[]) {
final int TESTS = 1000000;
double[] floats = new double[TESTS];
Random random = new Random();
for (int i = 0; i < TESTS; ++i) {
int zeros = random.nextInt(6) + 3; // divide by 10^zeros
double digits = random.nextInt(100) + 100; // 3 last digits
floats[i] = digits/Math.pow(10,zeros) + random.nextInt(20) + 1;
}
long startTime = System.nanoTime();
for (int i = 0; i < TESTS; ++i)
truncateTo2NonZero(floats[i]);
long endTime = System.nanoTime();
long duration = endTime - startTime;
System.out.println(duration/1000000); // in milliseconds
}
我使用Windows 7家庭高级版64位。的java -version
输出:
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
这看起来不像那些笨蛋。这里的OP想要有一个动态的小数位数,即保留最多两个第一个非零的十进制数字。 – Tunaki
@copeg不重复。这就像Tunaki说的。我认为从我给出的两个例子中可以清楚地看出。 – devil0150
“浮点”“十进制数字”这两个短语不应出现在同一句子中。你应该使用'BigDecimal'。 –