0

結果が科学表記法に表示されることなく、フロートを文字列表現に変換しようとしています。

私が最初に試した:

ToString("0." + new string('#', 7))

しかし、これは大きな値では機能しないようです。例えば ​​:

float largeNumber = 12345678f;
string str = largeNumber.ToString("0." + new string('#', 7));

結果は"12345680"

私はそれから試しましたToString("R")

これは上記の大きな数値に対しては機能しますが、数値が大きくなりすぎると、指数表記で表示されます。たとえば、5000000000f結果は"5E+09". 0.0005そして、結果のような小さな数0.0004999999966

私も2つを混ぜてみましたが、それでも科学表記法が得られる場合があります。

私のテストプログラムを以下に貼り付けます。精度の問題があることは承知していますが、私が持っているものよりもうまくできるかどうか疑問に思っていますか?

class Program
{
    static void Main(string[] args)
    {
        Write(0.123456789f);
        Write(0.12345678f);
        Write(0.1234567f);
        Write(0.123456f);
        Write(0.12345f);
        Write(0.1234f);
        Write(0.123f);
        Write(0.12f);
        Write(0.1f);
        Write(1);
        Write(12);
        Write(123);
        Write(1234);
        Write(12345);
        Write(123456);
        Write(1234567);
        Write(12345678);
        Write(123456789);

        Console.WriteLine();

        float f = 5000000000f;
        for (int i = 0; i < 17; ++i)
        {
            Write(f);
            f /= 10;
        }

        Console.WriteLine();

        f = 5000000000f;
        for (int i = 0; i < 17; ++i)
        {
            Write(f < 1 ? f + 1 : f);
            f /= 10;
        }

        Console.Read();
    }

    static void Write(float f)
    {
        //string str = f.ToString("0." + new string('#', 7));
        //string str = f.ToString("R");
        string str = Math.Abs(f) < 1 ? f.ToString("0." + new string('#', 7)) : f.ToString("R");

        Console.WriteLine(str);
    }
}
4

3 に答える 3

2

問題は、float7 桁の精度しかサポートしていないことです。12345678f float で正確に表す方法はないため、表現可能な最も近い float 値に変換されます12345680f数値のサイズではなく、重要な問題は精度の桁数です。

また、2 進浮動小数点数で正確0.0005に表すことはできません。に最も近い 8 ビット 2 進浮動小数点数は0.00050.0004999999966

decimalははるかに高い精度をサポートし、標準のN書式指定子を使用して 10 進数を正確に表すことができます。

于 2014-12-04T20:14:50.527 に答える
0

フォーマット文字列の0はゼロ用ではなく、「ゼロ以外の場合は数字、ゼロの場合はゼロ」を表し、「#」は「ゼロ以外の場合は数字、ゼロの場合は何もない」を表します。

f.ToString("0." + new string('#', 7))ゼロを超える数値の形式を使用できます

PowerShell でテストしたところ、問題なく動作しますが、おそらく double または decimal を使用しています。

PS C:\> $test = "{0:0.0######}"
PS C:\> $test -f 0.5
0,5
PS C:\> $test -f 0.4443423
0,4443423
PS C:\> $test -f 123.4443423
123,4443423
PS C:\> $test -f 45425123.4443423
45425123,4443423

間違いなく、問題はfloat精度のようです:

PS C:\> $test -f [float]45425123.4443423
45425120,0
于 2014-12-04T20:11:54.433 に答える