web-dev-qa-db-ja.com

ダブルを小数点以下3桁に制限

これは私が達成しようとしているものです:

Doubleに小数点以下3桁以上がある場合、小数点以下3桁を超える部分は切り捨てます。 (丸めないでください。)

Eg.: 12.878999 -> 12.878

Doubleの小数点以下が3桁未満の場合は、そのままにしておきます

Eg.:   125   -> 125
       89.24 -> 89.24

私はこのコマンドに出会いました:

double example = 12.34567;
double output = Math.Round(example, 3);

しかし、私は丸めたくありません。上記のコマンドによると、12.34567 -> 12.346

次のように値を切り捨てたい:12.345

44
xbonez

倍精度には小数点以下の桁はありません-小数点以下の桁に基づいていません。 「小数点以下3桁に切り捨てると、現在の値に最も近い倍精度」を取得できますが、それでもまったく同じではありません。 decimalを使用した方が良いでしょう。

とはいえ、丸めが問題になるのはそれだけである場合は、Math.Truncate(value * 1000) / 1000; whichmayを使用できます。 (丸みは必要ありません。その音によって。)それでも潜在的に「危険」です。実際には小数点以下3桁です。ただし、10進値で同じことをした場合、wouldは機能します:

decimal m = 12.878999m;
m = Math.Truncate(m * 1000m) / 1000m;
Console.WriteLine(m); // 12.878

編集:LBushkinが指摘したように、displayの目的で切り捨てる(通常は書式指定子で実行できます)と、さらに計算するために切り捨てることを明確にする必要があります(この場合、上記が機能するはずです)。

62
Jon Skeet

表示目的以外で明示的に精度を失う理由は考えられません。その場合、単に文字列の書式設定を使用します。

double example = 12.34567;

Console.Out.WriteLine(example.ToString("#.000"));
39
Chris Martin
double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));
18
Merin Nakarmi

1000で乗算してから Truncate を使用してから1000で除算します。

7
Josh

数字を切り捨てる目的が表示上の理由である場合は、doubleを文字列に変換するときに適切なフォーマットを使用するだけです。

String.Format()Console.WriteLine()(およびその他)のようなメソッドを使用すると、値がフォーマットされる精度の桁数を制限できます。

浮動小数点数を「切り捨てる」ことはお勧めできません-浮動小数点数は、多くの場合、正確な10進表現を持ちません。数値の拡大、切り捨て、縮小などのアプローチを適用すると、値が「切り捨てられた」値に対して予想されるものとはまったく異なるものに簡単に変更される可能性があります。

数値の正確な10進表現が必要な場合は、decimalまたはdoubleではなくfloatを使用する必要があります

5
LBushkin

次を使用できます。

double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;
3

上記の良い答え-あなたがここで再利用可能なものを探しているなら、コードです。小数点以下の桁数を確認することをお勧めしますが、これはオーバーフローする可能性があります。

public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
{
    decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));

    return Math.Truncate((power * numberToTruncate)) / power;
}
1
Mike M.

C言語では:

double truncKeepDecimalPlaces(double value, int numDecimals)
{
    int x = pow(10, numDecimals);
    return (double)trunc(value * x) / x;
}
1
alsantos123