13

数値を小数点以下 2 桁に切り詰める必要があります。これは基本的に、余分な桁を切り捨てることを意味します。

例えば:

2.919     ->      2.91

2.91111   ->     2.91

なんで?これは、特定の精度の数値を格納するときに SQL サーバーが行っていることです。たとえば、列が Decimal(8,2) で、数値 9.1234 を挿入/更新しようとすると、3 と 4 が切り捨てられます。

C# コードでもまったく同じことを行う必要があります。

私が考えることができる唯一の可能な方法は、次のいずれかです。

  1. stringformatter を使用して小数点以下 2 桁のみを「出力」し、次に小数点以下に変換します。たとえば、次のようになります。

      decimal tooManyDigits = 2.1345
    
    decimal ShorterDigits = Convert.ToDecimal(tooManyDigits.ToString("0.##"));
    
    // ShorterDigits is now 2.13
    

    文字列への変換と、別の文字列から 10 進数への変換が必要なため、これには満足できません。

  2. Math.Truncate (整数のみを受け入れる) を使用すると、100 を掛けて切り捨て、100 で割ることができます。例:

    decimal tooLongDecimal = 2.1235;
    
    tooLongDecimal = Math.Truncate(tooLongDecimal * 100) / 100;
    

    また、tooLongDecimal が 0 の場合、0 による除算のエラーが発生するため、これにも満足していません。

確かに、より良い+簡単な方法があります! 助言がありますか?

4

5 に答える 5

8

あなたは自分で質問に答えました。ゼロ除算の意味を誤解しているようです。これを行う正しい方法は、次のように乗算、切り捨て、除算することです。

decimal TruncateTo100ths(decimal d)
{
    return Math.Truncate(d* 100) / 100;
}

TruncateTo100ths(0m);       // 0
TruncateTo100ths(2.919m);   // 2.91
TruncateTo100ths(2.91111m); // 2.91
TruncateTo100ths(2.1345m);  // 2.13

ここには 0 による除算はなく、完全に安全な 100 による除算しかありません。

于 2013-07-14T22:30:48.170 に答える
3

同様の要件があったpswgに同意します。ここに私の経験と、切り捨てのためのより一般化された関数があります。

http://snathani.blogspot.com/2014/05/truncating-number-to-specificnumber-of.html

public static decimal Truncate(decimal value, int decimals)
{
    decimal factor = (decimal)Math.Pow(10, decimals);
    decimal result = Math.Truncate(factor * value) / factor;
    return result;
}
于 2014-05-14T00:16:24.977 に答える
1

を使用すると、丸めdecimal.ToString('0.##') も課せられます。

1.119M.ToString("0.##")  // -> 1.12

(ええ、おそらくコメントであるべきですが、それ自体を適切にフォーマットするのは難しいです。)

于 2013-07-14T22:31:55.550 に答える