JavaScript から Java にアルゴリズムを移植する際に、JavaScript の toPrecision() を置き換える必要があるという問題に遭遇しました。問題は、数値がどのくらい小さいか大きいかがわからないため、正しい形式で単純な NumberFormat を使用できないことです。
同様の機能を提供する標準クラスはありますか?
編集これが私が思いついたものです:
double toPrecision(double n, double p) {
if (n==0) return 0;
double e = Math.floor(Math.log10(Math.abs(n)));
double f = Math.exp((e-p+1)*Math.log(10));
return Math.round(n/f)*f;
}
原則として、正しいことを行いますが、丸め誤差によって完全に台無しになります。たとえば、
toPrecision(12.34567, 3)
返品12.299999999999997
編集 2 このバージョンは、12 個のテスト ケースのうち 11 個で完全に機能します...
double toPrecision(double n, double p) {
if (n==0) return 0;
double e = Math.floor(Math.log10(Math.abs(n)));
double f = Math.round(Math.exp((Math.abs(e-p+1))*Math.log(10)));
if (e-p+1<0) {
f = 1/f;
}
return Math.round(n/f)*f;
}
しかし、それでも代わりにtoPrecision(0.00001234567, 3)
戻ります1.2299999999999999E-5
1.23E-5