【发布时间】:2016-07-15 18:50:26
【问题描述】:
我想将 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
}
我使用的是 64 位 Windows 7 家庭高级版。 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 希望有一个动态的小数位数,即保留前两个非零小数位数。
-
@copeg 不重复。就像图纳基说的那样。我认为从我给出的两个例子中可以很清楚地看到。
-
"floating point" "decimal digits" 这两个短语不应该出现在同一个句子中。你应该使用
BigDecimal。
标签: java floating-point