1. ホーム
  2. algorithm

[解決済み] 任意の有効桁数への丸め方

2023-06-26 05:49:29

質問

どのようにしたら を丸めることはできますか? を有効数字N桁に丸める方法を教えてください。

例えば、有効数字3桁に丸めたい場合、取りうる式を探しています。

1,239,451となり、1,240,000を返す。

12.1257とリターン12.1

.0681と入力すると、.0681を返します。

5 を指定して 5 を返す

当然ながら、アルゴリズムは3のNだけを処理するようにハードコードされるべきではありません(それはスタートでしょうが)。

どのように解決するのですか?

他の回答にある 12.100000000000001 のバグを取り除いた Java の同じコードです。

また、繰り返されたコードを削除し power を整数型に変更し、浮動小数点数の問題を回避しました。 n - d が行われ、長い中間値をより明確にするために

バグの原因は、大きな数字と小さな数字を掛け合わせることでした。 代わりに似たような大きさの2つの数を割っています。

EDIT

より多くのバグを修正。 0だとNaNになってしまうので、チェックを追加。 関数が実際に負の数で動作するようにした(負の数の対数は複素数であるため、元のコードでは負の数を扱えない)。

public static double roundToSignificantFigures(double num, int n) {
    if(num == 0) {
        return 0;
    }

    final double d = Math.ceil(Math.log10(num < 0 ? -num: num));
    final int power = n - (int) d;

    final double magnitude = Math.pow(10, power);
    final long shifted = Math.round(num*magnitude);
    return shifted/magnitude;
}