7

誰でもここで何が起こっているのか説明してもらえますか:

using System;
using System.Text;

namespace ConsoleApplication1 {

    class Program {

        static void Main(string[] args) {

            object o = 1000000.123f;
            float f= Convert.ToSingle(o);
            double d = Convert.ToDouble(f);

            Console.WriteLine(f.ToString("r"));
            Console.WriteLine(d.ToString("r"));

            Console.ReadLine();

        }
    }
}

どの出力:

1000000.13

1000000.125

私は期待しました:

オブジェクト o は基本的な float 型を持ちます (オブジェクト {float} として型付けされているウォッチ ウィンドウを観察すると、発生するようです)。

その 1000000.123f は 1000000.125 として f に格納されます (32 ビットでの IEEE754 近似値?)

double が 1000000.125 も格納すること ( f に期待したものが含まれていないように見えても、発生するようです)

ToString で往復形式を要求すると、どちらの場合も 1000000.125 が返されます。

fをひもでつなぐときに1000000.13を取得するために私が間違っていることを誰かに教えてもらえますか?

4

1 に答える 1

6

すでに見てきたように、数値 1000000.123 は 1000000.125 として保存されます。これは によってそのままレンダリングされますが、桁数が多すぎると誤解を招くためdouble.ToString()、 によって切り捨てられます。float.ToString()

ちなみに、Convert.ToSingle(float)渡したものとまったく同じものを返すだけなので、ありません。コードは実際にはConvert.ToSingle(double). したがって、(暗黙的に) に変換しdouble、次に (明示的に) に戻しますfloat。これは基本的にノーオペレーションです。

注意: JavaScript 浮動小数点計算機を信用しないでください。1000000.123 は単精度浮動小数点数によって 1000000.1 として格納されると主張する人もいますが、これは、IEEE 浮動小数点数の精度が約 7.22 桁であるため、8 桁で正確に表現できるという仮定に基づいていると推測しています。これは正しくありません。

于 2014-02-10T21:33:25.537 に答える