1 つのオプションは、文字列操作を 3 回使用することです。
- 元のテキストを値に解析し
decimal
ます (これにより、元の小数点以下の桁数が保持されます)
- 文字列フォーマットを使用して、小数点以下 4 桁までの文字列を完成させます。(最大で4DP
Math.Round
が存在することを保証しますが、正確に4DP ではないことを保証します。)
- フォーマットの結果を解析して、
decimal
正確に 4DP の値に戻します。
だから、このようなもの:
public static decimal Force4DecimalPlaces(string input)
{
decimal parsed = decimal.Parse(input, CultureInfo.InvariantCulture);
string intermediate = parsed.ToString("0.0000", CultureInfo.InvariantCulture);
return decimal.Parse(intermediate, CultureInfo.InvariantCulture);
}
このような文字列変換を使用することには抵抗がありますが、代替手段は比較的トリッキーです。生のビットを取得し、さまざまな部分を分割して仮数とスケールを見つけてから、適切に調整するか、一連の算術演算を実行して適切なスケールにすることができます。(1.0000m を掛ける Jeppe のアプローチは完全に正しいかもしれません -それが正しいと文書化されているかどうかはわかりません.
上記のコードは、私が知る限り、半分で切り上げを実行することに注意してください。たとえば、1.12345 は 1.1235 に変換されます。
コメントに出力を含むサンプル:
using System;
using System.Globalization;
class Test
{
static void Main()
{
Console.WriteLine(Force4DecimalPlaces("0.0000001")); // 0.0000
Console.WriteLine(Force4DecimalPlaces("1.000000")); // 1.0000
Console.WriteLine(Force4DecimalPlaces("1.5")); // 1.5000
Console.WriteLine(Force4DecimalPlaces("1.56789")); // 1.5679
}
public static decimal Force4DecimalPlaces(string input)
{
decimal parsed = decimal.Parse(input, CultureInfo.InvariantCulture);
string intermediate = parsed.ToString("0.0000", CultureInfo.InvariantCulture);
return decimal.Parse(intermediate, CultureInfo.InvariantCulture);
}
}