1

簡単な質問:

Console.WriteLine("Double: " + 2.0151231E7);

ダブル: 20151231

Console.WriteLine("Single: " + 2.0151231E7F);

シングル: 2.015123E+07

なんで?


背景: 要素が宣言されている SOAP Web サービスを使用しています。

<xsd:element name="VALUE_FROM" type="xsd:float" />

SOAP 応答では、次のようになります。

<VALUE_FROM>2.0151231E7</VALUE_FROM>

しかし、20151231 ではなく 20151230 を取得しています。

4

3 に答える 3

5

20151231 は 2 進数で 25 桁です。Aの仮数部には 24 桁の 2 進数floatしかありません。

したがって、最後のビットは行かなければなりませんでした。

于 2012-07-18T16:30:11.530 に答える
3

これは、Double データ型に対する Float (IEEE 754) の精度に関係しています。後者の方が精度が高いため、数値を完全に表すことができます。

単精度浮動小数点数がコンピュータでどのように表現されるかを定義するIEEE 754標準では、仮数 (小数部) に対して 24 ビットの精度 (情報) と指数に対して 8 ビットの情報のみを指定しています。

于 2012-07-18T16:29:44.343 に答える
1

これは、float(.NetではSystem.Singleで表される)が単に十分に正確ではないためです。

floatの代わりにdoubleを使用すると、精度が大幅に向上しますが、それでもある程度の(ただしはるかに少ない)近似値が得られます。

精度を損なうことなく整数を操作する場合は、整数型(int、uint、long、ulongなど)を使用します。

ドキュメントから:

浮動小数点値と精度の低下

浮動小数点数は10進数にしか近似できないこと、および浮動小数点数の精度によって、その数値が10進数に近似する精度が決まることに注意してください。デフォルトでは、単一の値には小数点以下7桁の精度しか含まれていませんが、内部では最大9桁が維持されます。浮動小数点数の精度には、いくつかの結果があります。

特定の精度で等しいように見える2つの浮動小数点数は、最下位桁が異なるため、等しく比較されない場合があります。

10進数を使用すると、浮動小数点数が10進数に正確に近似しない​​可能性があるため、浮動小数点数を使用する数学演算または比較演算では、同じ結果が得られない場合があります。

浮動小数点数が含まれている場合、値はラウンドトリップしない可能性があります。演算が元の浮動小数点数を別の形式に変換し、逆演算が変換された形式を浮動小数点数に変換し、最終的な浮動小数点数が元の浮動小数点数と等しい場合、値はラウンドトリップと呼ばれます番号。変換で1つ以上の最下位桁が失われるか変更されるため、ラウンドトリップが失敗する可能性があります。

于 2012-07-18T16:31:15.200 に答える