Một giải pháp thẳng về phía trước có thể trông như thế này:
public class Scribble {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
double d = 1d/((double)i);
float f = (float) d;
boolean lossless = d == f;
System.out.println(d + " can be converted " + (lossless ? "lossless" : "only with loss"));
}
}
}
nó ra:
1.0 can be converted lossless
0.5 can be converted lossless
0.3333333333333333 can be converted only with loss
0.25 can be converted lossless
0.2 can be converted only with loss
0.16666666666666666 can be converted only with loss
0.14285714285714285 can be converted only with loss
0.125 can be converted lossless
0.1111111111111111 can be converted only with loss
0.1 can be converted only with loss
chỉnh sửa: tốc độ chương trình so sánh, method2 rằng có vẻ là nhanh nhất:
method1 | method2 | method3
237094654 | 209365345 | 468025911
214129288 | 209917275 | 448695709
232093486 | 197637245 | 448153336
249210162 | 200163771 | 460200921
240685446 | 200638561 | 447061763
332890287 | 337870633 | 450452194
247054322 | 199045232 | 449442540
235533069 | 200767924 | 452743201
256274670 | 199153775 | 453373979
298277375 | 198659529 | 456672251
229360115 | 205883096 | 454198291
25268| 224850463 | 452860277
246047739 | 200070587 | 458091501
304270790 | 204517093 | 463688631
235058620 | 204675812 | 448639390
260565871 | 205834286 | 458372075
256008432 | 242574024 | 498943242
311210028 | 208080237 | 478777466
242014926 | 208995343 | 457901380
239893559 | 205111348 | 451616471
mã:
public class Scribble {
static int size = 1024*1024*100;
static boolean[] results = new boolean[size];
static double[] values = new double[size];
public static void main(String[] args) {
// generate values
for (int i = 0; i < size; i++)
values[i] = 1d/((double)i);
long start;
long duration;
System.out.println(" method1 | method2 | method3 ");
for (int i = 0; i < 20; i++) {
start = System.nanoTime();
method1(size);
duration = System.nanoTime() - start;
System.out.printf("%9d", duration);
start = System.nanoTime();
method2(size);
duration = System.nanoTime() - start;
System.out.printf(" | %9d", duration);
start = System.nanoTime();
method3(size);
duration = System.nanoTime() - start;
System.out.printf(" | %9d\n", duration);
}
}
private static void method1(int size) {
boolean[] results = new boolean[size];
for (int i = 0; i < size; i++) {
double d = values[i];
float f = (float) d;
boolean lossless = d == f;
results[i] = lossless;
}
}
private static void method2(int size) {
for (int i = 0; i < size; i++) {
double d = values[i];
results[i] = d == (double)(float)d;
}
}
private static void method3(int size) {
for (int i = 0; i < size; i++) {
double d = values[i];
results[i] = Double.compare(d, (float) d) == 0;
}
}
}
Tại sao điều này sẽ là một ý tưởng tốt? Chắc chắn bộ nhớ không thể là mối quan tâm của bạn. Các biện minh kỹ thuật cho nó là gì? – duffymo
Ví dụ khi nối tiếp hàng triệu đôi. Nếu bạn có thể dự trữ byte bằng cách sử dụng phao, bạn có thể đạt được rất nhiều tốc độ hoặc giảm không gian. Đặc biệt thú vị trên mạng chậm hoặc phương tiện chậm – RobAu