3

私は永遠に探していましたが、答えを見つけることができず、どれも正しく機能しません。

0.33333333333 のような double を 0,33 に、または 0.6666666666 を 0,66 に変換したい

ただし、0.9999999999 のような数値は 1 になるはずです。

のようなさまざまな方法を試しました

value.ToString("##.##", System.Globalization.CultureInfo.InvariantCulture)

ガベージを返すか、数値を誤って丸めます。何か助けてください。

基本的にすべての数値は 9 で除算され、四捨五入せずに小数点以下 2 桁で表示する必要があります。

9.999999999 までの数値でうまく機能するように見える素敵な関数を見つけました。それを超えると、10 進数が 1 つ失われ始めます。200.33333333333 のような数値では、200,33 ではなく 200 が表示されます。その人たちの修正はありますか?

ここにあります:

string Truncate(double value, int precision)
{
    string result = value.ToString();

    int dot = result.IndexOf(',');
    if (dot < 0)
    {
        return result;
    }

    int newLength = dot + precision + 1;

    if (newLength == dot + 1)
    {
        newLength--;
    }

    if (newLength > result.Length)
    {
        newLength = result.Length;
    }

    return result.Substring(0, newLength);
}
4

5 に答える 5

8

やってみました

Math.Round(0.33333333333, 2);

アップデート*

小数点以下を丸めたくない場合は、double を文字列に変更し、部分文字列を小数点以下 2 桁まで取得して double に変換し直すことができます。

doubleString = double.toString();
if(doubleString.IndexOf(',') > -1)
{
   doubleString = doubleString.Substring(0,doubleString.IndexOf(',')+3);
}
double = Convert.ToDouble(doubleString);

if ステートメントを使用して .99 をチェックし、その場合は 1 に変更できます。

于 2013-08-09T18:50:14.143 に答える
5
Math.Truncate(value * 100)/100

除算が浮動小数点数にどのように影響するかについては保証しませんが。10 進数は、基数 10 ではなく基数 2 として格納されるため、浮動小数点で正確に表現できないことがよくあります。信頼性を保証したい場合は、decimalではなく を使用してdoubleください。

于 2013-08-09T18:48:09.787 に答える
2
Math.Round((decimal)number, 2)

最初に 10 進数にキャストすると、ドキュメント ページで説明されている精度の問題を回避できます。

于 2013-08-09T18:50:22.457 に答える
1

以下から 1 つを試すことができます。これには多くの方法があります。

1. 
 value=Math.Round(123.4567, 2, MidpointRounding.AwayFromZero) //"123.46"
2.
 inputvalue=Math.Round(123.4567, 2)  //"123.46"
3. 
 String.Format("{0:0.00}", 123.4567);      // "123.46"
4. 
string.Format("{0:F2}", 123.456789);     //123.46
string.Format("{0:F3}", 123.456789);     //123.457
string.Format("{0:F4}", 123.456789);     //123.4568
于 2015-10-17T07:41:15.330 に答える