Javaの浮動小数点数を最初の0でない10進数の2桁まで切り捨てたい。例えば、0.000134
から0.00013
、または11.00401
から11.0040
です。浮動小数点数を2つの最初の0以外の10進数に切り捨てる
私が考えることができる唯一の解決策は、整数部分を取り除き、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は、動的な小数点以下の桁数、すなわち2つの最初のゼロでない10進数字を保持することを望んでいる。 – Tunaki
@copeg重複しない。それはTunakiが言うようなものです。私が与えた2つの例からはかなり明らかだと思います。 – devil0150
"浮動小数点" "10進数字"これらの2つのフレーズは、同じ文には表示されません。 'BigDecimal'を使うべきです。 –