0

現在、文字列から長い数字を読み取っています。数値は3桁の整数で、その後に小数点なしの7桁が続きます(例1234567890)。

解析する前にこの数値を分割するにはどうすればよいですか?

私はそれを整数に解析しようとしていますが、整数の最大値は最大20億です。

これが私が試したことです:

class Program
{
    static void Main(string[] args)
    {
        using (StreamReader reader = new StreamReader("CLIFF.dat"))
        {
            string line;
            var locations = new Dictionary<string, int[]>() {
                {"210", new [] {405, 4, 128, 12, 141, 12, 247, 15}}, 
                {"310", new [] {321, 4, 112, 12, 125, 12, 230, 15}}, //
                {"410", new [] {477, 4, 112, 12, 125, 12, 360, 15 }} 
            };
 while ((line = reader.ReadLine()) != null)
            {                 
                    var lineStart = line.Substring(0, 3);

                    if (lineStart == "210" || lineStart == "310" || lineStart == "410")
                    {
                        var currentLocations = locations[lineStart];
                        var letters = line.Substring(currentLocations[0], currentLocations[1]);

                        var transactionvolume =
                            int.Parse(line.Substring(currentLocations[2], currentLocations[3])) +
                            int.Parse(line.Substring(currentLocations[4], currentLocations[5]));
                        var watching = line.Substring(currentLocations[6], currentLocations[7]);
                        var number = int.Parse(line.Substring(currentLocations[6], currentLocations[7])*));

現在の場所[6]の数値が大きすぎるため、10^-7を掛ける必要があります。

4

2 に答える 2

0

回答へのコメントの恥ずべきロールアップ:

問題は、32 ビットの符号付き整数が最大で 21 億 (正確には 2,147,483,647) の値を処理できることです。文字列から直接変換した値が大きすぎます。

コメントで概説されているように、可能な戦略は次のとおりです。

  • より大きなデータ型を使用してください。long、double、decimal、bigint などはすべて、数百億以上の数値を処理できます (ただし、浮動小数点型では、数値が高くなるほど精度が低下します)。浮動小数点型が必要で、小数点以下 7 桁が必要なので、個人的には Decimal を使用します。これは 128 ビットの最大のデータ型ですが、浮動小数点型の最高の精度を備えています。つまり、任意の整数値を入れ、10 7で除算して正しい答えを得ることが期待できます。

  • 分割統治。数値は既に文字列として取得されており、小数点以下 7 桁であることがわかっています。したがって、浮動小数点型に解析できるように、文字列のどこに小数点を置くかがわかります。

    decimal myValue = decimal.Parse(myString.Substring(0, myString.Length-7) 
                                + "." 
                                + myString.Substring(myString.Length-7, 7));
    
于 2012-11-30T16:18:13.063 に答える
0

たぶん次のようなもの:

String input = "34567891234567";
int intPart = int.Parse(input.Substring(0, input.Length - 7));
int fracPart = int.Parse(input.Substring(input.Length - 7));
double val = intPart + fracPart * 0.0000001;
于 2012-11-30T16:20:42.367 に答える