48

こんにちは、DataSet の DataTable から DataRow を取り出しました。SQL で float データ型として定義されている列にアクセスしています。その値をローカル変数 (c# float データ型) に割り当てようとしていますが、InvalidCastExecption を取得しています

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];  

さて、これをいじってみましたが、うまくいきましたが、意味がなく、正しく感じませんでした。

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

ここで私が見逃していることを誰かが説明できますか?

4

6 に答える 6

84

SQLDbType のドキュメントによると、SQL float は doubleです。

于 2008-09-23T17:41:20.340 に答える
27

SQL の float は、CLR (C#/VB)のDoubleです。MSDNには、CLR に相当する SQL データ型の表があります

于 2008-09-23T17:49:43.687 に答える
4

また、データ型が不正確で計算エラーが発生するため、データに対して数学計算を実行する場合は、通常、SQL Server(または実数)でfloatを使用することはありません。精度が必要な場合は、代わりに10進数のデータ型を使用してください。

于 2008-09-23T18:17:12.560 に答える
2

Microsoft SQL Server の float は、C# の Double に相当します。この理由は、浮動小数点数は 10 進数しか近似できないためです。浮動小数点数の精度によって、その数値が 10 進数をどれだけ正確に近似できるかが決まります。Double 型は、負の 1.79769313486232e308 から正の 1.79769313486232e308 までの範囲の値と、正または負のゼロ、PositiveInfinity、NegativeInfinity、Not-a-Number (NaN) の倍精度 64 ビット浮動小数点数を表します。

于 2008-09-23T18:05:48.547 に答える
0

「正しくないと感じる」理由は、C# がボックス化解除キャストに同じ構文を使用するためです。これらは 2 つの非常に異なるものです。exercise["DefaultAccelLimit"]オブジェクトとしてボックス化された double 値を含みます。オブジェクトをダブルにアンボックス(double)するには必要です。その前に、double を float 値にキャストします。C# では、ボックス化とキャストを同じ操作で行うことができないため、ボックス化を解除してからキャストする必要があります。(float)

キャストが非破壊的であっても同じことが当てはまります。double にキャストするオブジェクトとして float がボックス化されている場合は、次のようにします(double)(float)object_var

于 2015-10-14T18:58:17.367 に答える
0

主な質問はここで回答されたと思いますが、これが機能すると述べている質問のセクションに何かを追加する必要があると感じています.

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

これが「機能する」理由と「正しく感じられない」理由は、2 番目のキャスト (左のキャスト) によって double を float にダウングレードしているため、精度が失われ、コンパイラにそれを効果的に伝えているためです。返された値を切り捨てても問題ありません。

つまり、この行は次のように述べています... オブジェクトを取得します (この場合、たまたま double を保持します) オブジェクトを double にキャストします (すべてのオブジェクト ラッピングを失います) double を float にキャストします (すべての細かい精度を失います)ダブル)

たとえば、値が 0.0124022806089461 の場合、上記を実行すると、AccelLimit の値は 0.01240228 になります。

これは、C# の float が double 値から取得できる範囲です。これは危険なことであり、丸めではなく切り捨てであると確信していますが、よくわからないので、誰かがこれを確認したいかもしれません。

于 2015-10-08T13:28:51.733 に答える