.NETの10進数、浮動小数点数、倍精度浮動小数点数の違いは何ですか?


回答:


2267

floatそして、doubleされている浮動小数点型を。つまり、次のような数値を表します。

10001.10010110011

2進数と2進小数点の位置の両方が値内にエンコードされます。

decimal浮動小数点タイプです。つまり、次のような数値を表します。

12345.65789

繰り返しになりますが、小数点の数と位置はどちらも値内にエンコードされますdecimal。これが、固定小数点型ではなく浮動小数点型になる理由です。

注意すべき重要なことは、人間は非整数を10進形式で表現することに慣れており、正確な結果を10進表現で期待することです。すべての10進数が2進浮動小数点(たとえば、0.1)で正確に表現できるわけではないため、2進浮動小数点値を使用すると、実際には0.1に近い値が得られます。浮動小数点を使用した場合でも、近似値が得られます。たとえば、1を3で除算した結果は、正確に表すことができません。

何を使用するかについては:

  • 「自然に正確な小数」である値には、を使用することをお勧めしますdecimal。これは通常、人間が発明したすべての概念に適しています。金銭的価値は最も明白な例ですが、他にもあります。例えば、ダイバーやアイススケーターに与えられるスコアを考えてみてください。

  • とにかく正確に測定することができない自然のより多くのアーティファクトである値の場合、float/ doubleがより適切です。たとえば、科学データは通常、この形式で表されます。ここでは、元の値は最初は「10進数の精度」ではないため、期待される結果が「10進数の精度」を維持することは重要ではありません。浮動小数点型は、10進数よりもはるかに高速に処理できます。


58
float/ double通常はとして数値を表しません101.101110。通常、次のように表されます1101010 * 2^(01010010)-指数
Mingwei Samuel

79
@ハザード:それが答えの「そして二進小数点の位置」の部分が意味することです。
Jon Skeet、2014

112
まだ言われておらずfloat、C#のエイリアスキーワードであり、.Netタイプではないことに驚いています。それはSystem.Single..でsingleありdouble、浮動小数点型です。
Brett Caswell、2015

54
@BKSpurgeon:まあ、すべてがバイナリ型であると言えるのと同じ方法でのみ、その時点でそれはかなり役に立たない定義になります。Decimalは、結果が仮数* 10 ^ scaleであるのに対して、整数の仮数とスケールとして表される数値であるという点で、10進数型です。一方、floatとdoubleは、仮数* 2 ^ scaleです。あなたは小数で書かれた数を取り、小数点を十分に右に動かして整数を取得し、仮数とスケールを計算します。float / doubleの場合は、バイナリで記述された数値から始めます。
Jon Skeet、2015年

21
別の違い:float 32ビット。ダブル64ビット。10進数の128ビット。
David

1073

精度が主な違いです。

フロート -7桁(32ビット)

2桁の-15-16桁(64ビット)

10進数の -28-29の有効数字(128ビット)

小数の精度ははるかに高く、通常、高い精度を必要とする金融アプリケーションで使用されます。10進数はdouble / floatよりもはるかに低速です(一部のテストでは最大20倍)。

小数とフロート/ダブルはキャストなしでは比較できませんが、フロートとダブルは比較できます。10進数では、エンコードまたは末尾のゼロも使用できます。

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

結果:

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333

65
@Thecrocodilehunter:申し訳ありませんが、違います。10進数は、10進表記で表現できるすべての数値を表すことができますが、たとえば1/3は表すことができません。1.0m / 3.0mは0.33333333 ...と評価されます。最後に、3の数は大きくて有限です。3を掛けても正確な1.0は返されません。
Erik

50
@Thecrocodilehunter:正確さと正確さを混同していると思います。この文脈では、それらは異なるものです。精度は、数値を表すために使用できる桁数です。精度が高いほど、丸める必要が少なくなります。無限の精度を持つデータ型はありません。
Igby Largeman、2012年

13
@Thecrocodilehunter:測定されている値が正確で あると想定している0.1-それは現実の世界ではめったにありません! 任意の有限の記憶形式は、ビットパターンの有限数に可能な値の無限の数をconflateう。たとえば、floatはとを融合0.10.1 + 1e-8decimalはとを融合0.10.1 + 1e-29ます。確かに、所定の範囲内で、特定の値(例えば精度のゼロ損失で任意の形式で表現することができfloat、精度のゼロ損失で1.6e7に任意の整数を格納することができる) -それはまだない無限の精度。
Daniel Pryden、2012年

27
@Thecrocodilehunter:あなたは私のポイントを逃した。 特別な値で0.1はありません人間がベース10 好むため、0.1「より良い」唯一のことです。値があっても、2つの値を同じ方法で初期化すると、どちらも同じ値になります。それはその値が正確ではないということだけです -それはそれに最も近い値となりとして正確に表すことができます。確かに、2進浮動小数点数では、10進浮動小数点数でもです。 どちら完全に正確ではありません0.10000001float0.1 0.10.1float(1.0 / 10) * 10 != 1.0(1.0 / 3) * 3 != 1.0
Daniel Pryden 2012年

16
@Thecrocodilehunter:あなたはまだ理解していません。私はこれ以上はっきりこれを言うのか分からない:Cでは、あなたがない場合はdouble a = 0.1; double b = 0.1;、その後a == b trueになります。それはそれだけでaあり、両方が正確に等しくbなることはありません0.1。C#では、あなたがしなければdecimal a = 1.0m / 3.0m; decimal b = 1.0m / 3.0m;、その後a == bもtrueになります。しかし、その場合には、どちらab正確に等しい1/3-彼らは両方とも等しくなります0.3333...。では、両方の場合、いくつかの精度は表現のために失われます。あなたは頑固にdecimal、それがfalseである「無限」の精度を持っていると言います
Daniel Pryden 2012年

84

Decimal構造は、精度を必要とする財務計算に厳密に合わせられており、丸めには比較的耐性があります。ただし、いくつかの理由により、小数は科学的アプリケーションには適していません。

  • 測定される物理的な問題やアーチファクトの実際的な限界のため、多くの科学計算では、精度のある程度の損失は許容できます。精度の低下は、金融では許容されません。
  • Decimalは、ほとんどの操作でfloatおよびdoubleよりもはるかに(はるかに)遅くなります。これは、主に浮動小数点演算がバイナリで行われるためです。一方、Decimalはbase 10で行われます(つまり、floatおよびdoubleはMMX / SSEなどのFPUハードウェアによって処理されます。 、小数はソフトウェアで計算されます)。
  • Decimalは、より多くの桁数の精度をサポートしているにもかかわらず、doubleよりも許容範囲が狭い値の範囲を持っています。したがって、Decimalを使用して多くの科学的値を表すことはできません。

5
財務計算を行っている場合は、独自のデータ型を使用するか、正確なニーズに合った優れたライブラリを見つける必要があります。財務設定の精度は(人間の)標準化団体によって定義され、標準化団体は計算方法について非常に具体的なローカライズされた(時間と地理の両方で)ルールを持っています。正しい丸めのようなものは、.Netの単純な数値データ型ではキャプチャされません。計算を行う機能は、パズルのごく一部にすぎません。
James Moore

76
+---------+----------------+---------+----------+---------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                             |
| Type    | (System) type  |         | Occupied |                                             |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                 |
| short   | System.Int16   | Yes     | 2        | -32768 to 32767                             |
| int     | System.Int32   | Yes     | 4        | -2147483648 to 2147483647                   |
| long    | System.Int64   | Yes     | 8        | -9223372036854775808 to 9223372036854775807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                    |
| ushort  | System.Uint16  | No      | 2        | 0 to 65535                                  |
| uint    | System.UInt32  | No      | 4        | 0 to 4294967295                             |
| ulong   | System.Uint64  | No      | 8        | 0 to 18446744073709551615                   |
| float   | System.Single  | Yes     | 4        | Approximately ±1.5 x 10-45 to ±3.4 x 1038   |
|         |                |         |          |  with 7 significant figures                 |
| double  | System.Double  | Yes     | 8        | Approximately ±5.0 x 10-324 to ±1.7 x 10308 |
|         |                |         |          |  with 15 or 16 significant figures          |
| decimal | System.Decimal | Yes     | 12       | Approximately ±1.0 x 10-28 to ±7.9 x 1028   |
|         |                |         |          |  with 28 or 29 significant figures          |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)              |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                               |
+---------+----------------+---------+----------+---------------------------------------------+

詳細については、こちらをご覧ください


5
最大の違いは省略されました。これは、10進数タイプに使用される基数です(10進数は10として格納され、他のすべての数値タイプは2を基数とします)。
BrainSlugs83 2015年

1
シングルとダブルの値の範囲は、上の画像またはソースフォーラムの投稿に正しく表示されていません。ここではテキストを簡単に上付きにすることができないため、キャレット文字を使用します。シングルは10 ^ -45および10 ^ 38、ダブルは10 ^ -324および10 ^ 308にする必要があります。また、MSDNには-3.4x10 ^ 38から+ 3.4x10 ^ 38の範囲の浮動小数点があります。リンクが変更された場合は、MSDNでSystem.SingleおよびSystem.Doubleを検索してください。シングル:msdn.microsoft.com/en-us/library/b1e65aza.aspxダブル:msdn.microsoft.com/en-us/library/678hzkk9.aspx
deegee

2
小数は128ビットである...手段は、それが16バイトではない12占め
user1477332

51

他の回答やコメントで既に回答されているたくさんの良い(そしていくつかの悪い)情報を繰り返すことはしませんが、私はあなたのフォローアップの質問にヒントで答えます:

いつこれらのいずれかを使用しますか?

カウント値に小数を使用

測定値にはfloat / doubleを使用します

いくつかの例:

  • お金(お金を数えるか、お金を測定するか?)

  • 距離(距離をカウントするか、距離を測定するか?*)

  • スコア(スコアをカウントするか、スコアを測定するか?)

私たちは常にお金を数え、決してそれを測定すべきではありません。通常、距離を測定します。私たちはしばしばスコアを数えます。

*場合によっては、「公称距離」と呼ばれることもありますが、実際に距離を「カウント」したい場合があります。たとえば、都市までの距離を示す国の標識を扱っていて、それらの距離には10進数字(xxx.x km)が2桁以上ないことがわかっています。


1
私はこの答え、特に「お金を数えるか測定するか」という質問が本当に好きです。しかし、お金以外では、単なる整数ではない「数えられる」ものは考えられません。doubleの有効桁少なすぎるために、10進数を使用するアプリケーションをいくつか見ました。つまり、C#には4倍のen.wikipedia.org/wiki/Quadruple-precision_floating-point_format
John Henckel

48

float 7桁の精度

double 約15桁の精度

decimal 約28桁の精度

精度を上げる必要がある場合は、floatではなくdoubleを使用してください。最近のCPUでは、両方のデータタイプのパフォーマンスがほぼ同じです。フロートを使用する唯一の利点は、場所を取らないことです。あなたがそれらをたくさん持っている場合にのみ、実質的に重要です。

これは面白いと思いました。すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと


1
@RogerLipscombe:double32ビットを超える整数型が利用できdoubleず、53ビット整数型であるかのように使用されていた(たとえば、整数のペニー、または100分の1セントの整数)。最近ではそのようなことはあまり使われていませんが、多くの言語では、64ビット(場合によっては32ビットの場合もある)整数演算が行われるずっと前に倍精度浮動小数点値を使用できるようになりました。
スーパーキャット2014年

1
あなたの答えは、精度がこれらのデータ型の間の唯一の違いであることを意味します。通常、2進浮動小数点演算はハードウェアFPUに実装されているため、パフォーマンスは大幅に異なります。これは、一部のアプリケーションでは重要ではないかもしれませんが、他のアプリケーションにとって重要です。
2015年

6
@supercat doubleは、会計アプリケーションでは決して適切ではありません。Doubleは10進値のみを近似できるためです(それ自体の精度の範囲内でも)。これは、doubleがbase-2(バイナリ)中心の形式で値を格納するためです。
BrainSlugs83 2015年

2
@ BrainSlugs83:整数以外の量を保持するために浮動小数点型を使用することは不適切ですが、言語では、整数型が表すことができるよりも大きい整数値を正確に表すことができる浮動小数点型を使用することが歴史的に非常に一般的でした。おそらく最も極端な例は、整数型のみRealが-32768〜+32767に制限されていましたが、IIRCが単位精度で1.8E + 19までの値を表すことができるTurbo-87でした。会計アプリケーションRealがペニーの整数を表すために使用するのは、より賢明だと思います...
supercat

1
... 16ビットの値の束を使用して多精度数学を実行しようとするためです。他のほとんどの言語では違いはそれほど極端ではありませんでしたが、長い間、言語が4E9を超える整数型を持たずdouble、9E15までの単位精度を持つ型を持つことは非常に一般的でした。利用可能な最大の整数型よりも大きい整数を格納する必要がある場合double、特にプロセッサが16x16-> 32またはそれ以上を実行する命令を持っている場合、を使用することは、多倍精度計算を試そうとするよりも簡単で効率的です。 ..
スーパーキャット2015年

36

誰もそれについて言及していません

デフォルト設定では、Floats(System.Single)とdoubles(System.Double)はオーバーフローチェックを使用しませんが、Decimal(System.Decimal)は常にオーバーフローチェックを使用します。

というのは

decimal myNumber = decimal.MaxValue;
myNumber += 1;

OverflowExceptionをスローします。

しかし、これらはしません:

float myNumber = float.MaxValue;
myNumber += 1;

double myNumber = double.MaxValue;
myNumber += 1;

1
float.MaxValue+1 == float.MaxValueと同じようにdecimal.MaxValue+0.1D == decimal.MaxValue。たぶん、あなたは何かのような意味float.MaxValue*2ですか?
スーパーキャット2015年

@supercarしかし、decimal.MaxValue + 1 == decimal.MaxValue
GorkemHalulu

@supercar decimal.MaxValue + 0.1m == decimal.MaxValue ok
GorkemHalulu

1
System.Decimal全体のユニットを区別することができなくなる直前に、例外がスローされますが、アプリケーションは、例えばドルとセントを扱うことになっている場合、それは遅すぎるかもしれません。
スーパーキャット2015年

28
  1. doubleとfloatは、コンパイル時と実行時の両方で例外なく整数ゼロで除算できます。
  2. 10進数を整数ゼロで除算することはできません。そうすると、コンパイルは常に失敗します。

6
彼らは確かにできる!また、Infinity、Negative Infinity、NaN(数値ではない)などの2つの「マジック」値もあり、勾配の計算中に垂直線を検出するのに非常に役立ちます。さらに、floatを呼び出すかどうかを決定する必要がある場合.TryParse、double.TryParse、decimal.TryParse(たとえば、文字列が数値かどうかを検出するため)では、「Infinity」、「-Infinity」、および「NaN」を適切に解析するため、doubleまたはfloatを使用することをお勧めします。 、10進数ではありません。
BrainSlugs83

コンパイルは、リテラルdecimalをゼロ(CS0020)で除算しようとした場合にのみ失敗し、整数リテラルについても同様です。ただし、実行時の10進数値をゼロで割ると、コンパイルエラーではなく例外が発生します。
Drew Noakes 2016年

@ BrainSlugs83ただし、コンテキストによっては、「Infinity」または「NaN」を解析したくない場合があります。開発者が十分に厳格でない場合、ユーザー入力のための良いエクスプロイトのようです。

28

前述のように、整数は整数です。.7、.42、.007などのポイントは保存できません。整数ではない数値を格納する必要がある場合は、別のタイプの変数が必要です。ダブルタイプまたはフロートタイプを使用できます。これらのタイプの変数は、まったく同じ方法intで設定します。単語を使用する代わりに、doubleまたはを入力しますfloat。このような:

float myFloat;
double myDouble;

floatは「浮動小数点」の略で、端に何か点がある数字を意味します。)

2つの違いは、保持できる数値のサイズです。の場合float、番号には7桁まで使用できます。以下のためdoubleの、あなたは16桁まで持つことができます。より正確には、公式サイズは次のとおりです。

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308

floatは32ビットの数値でdouble、64ビットの数値です。

新しいボタンをダブルクリックして、コードを取得します。次の3行をボタンコードに追加します。

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

プログラムを停止して、コーディングウィンドウに戻ります。この行を変更します。

myDouble = 0.007;
myDouble = 12345678.1234567;

プログラムを実行し、ダブルボタンをクリックします。メッセージボックスに番号が正しく表示されます。ただし、最後に別の数値を追加すると、C#は再度切り上げまたは切り捨てを行います。道徳は、正確さが必要な場合は、丸めに注意してください!


2
あなたが言及した「何かを指す」は、一般に数値の「小数部分」と呼ばれます。「浮動小数点」は「最後に何か点がある数」を意味しません。しかし、代わりに「浮動小数点」は「固定小数点」数値(小数値も格納できる)とは対照的に、数値のタイプを区別します。違いは、精度が固定か浮動かです。-浮動小数点数は、精度を犠牲にして値のダイナミックレンジ(MinおよびMax)を大幅に拡大しますが、固定小数点数は、範囲を犠牲にして一定の精度を提供します。
BrainSlugs83 2017

16
  • float:±1.5 x 10 ^ -45から±3.4 x 10 ^ 38(〜7桁の有効数字)
  • double:±5.0 x 10 ^ -324から±1.7 x 10 ^ 308(有効数字15-16)
  • 10進数:±1.0 x 10 ^ -28から±7.9 x 10 ^ 28(28-29の有効数字)

9
違いは単なる精度以上のものです。- decimal実際には10進数形式で格納されます(基数2ではなく、2つの数値システム間の変換により数字が失われたり丸められたりすることはありません)。さらに、decimalNaN、-0、∞、-∞などの特別な値の概念はありません。
BrainSlugs83 2017

13

これは私にとって興味深いスレッドでした。今日、decimal精度がに劣るという点で、厄介な小さなバグが発生しましたfloat

C#コードでは、Excelスプレッドシートから数値を読み取り、それらをに変換してから、decimalこれdecimalをサービスに送信してSQL Serverデータベースに保存しています。

Microsoft.Office.Interop.Excel.Range cell = 
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}

これで、ほとんどすべてのExcel値で、これは美しく機能しました。しかし、一部の非常に小さなExcel値でdecimal.TryParseは、値を完全に使用できなくなりました。そのような例の1つは

  • cellValue = 0.00006317592

  • Decimal.TryParse(cellValue.ToString()、out value); // 0を返します

奇妙なことに、解決策はExcelの値をdouble最初に変換し、次にに変換することでしたdecimal

Microsoft.Office.Interop.Excel.Range cell = 
object cellValue = cell.Value2;
if (cellValue != null)
{
    double valueDouble = 0;
    double.TryParse(cellValue.ToString(), out valueDouble);
    decimal value = (decimal) valueDouble;
    
}

double精度はaよりも低くなりますがdecimal、これにより実際には小さな数字も認識されることが保証されます。何らかの理由で、double.TryParse実際にはそのような小さな数を取得できましたが、decimal.TryParseそれらをゼロに設定していました。

奇数。非常に奇妙な。


3
好奇心から、cellValue.ToString()の生の値は何でしたか?Decimal.TryParse( "0.00006317592"、out val)が機能するようです...
micahtan

11
-1私を誤解しないでください。もし真実なら、それは非常に興味深いですが、これは別の質問です。確かにこの質問に対する答えではありません。
ウェストン、2013年

2
Excelセルがdoubleを返し、ToString()値が "6.31759E-05"であったためか、decimal.Parse()が表記を好まなかった可能性があります。Decimal.TryParse()の戻り値を確認した場合、それはfalseであったに違いない。
SergioL 2014年

2
@weston Answersは、見逃したニュアンスを埋めることで、他の回答を補完することがよくあります。この回答は、構文解析の違いを強調しています。質問への答えです!
ロビノ

1
ええと... decimal.Parse("0.00006317592")動作します-何か他のことが起こっています。-おそらく科学的表記ですか?
BrainSlugs83 2017

9

メモリとパフォーマンスの両方が重要であるゲームや組み込みシステムなどのアプリケーションの場合、floatは、doubleの半分のサイズで高速であるため、通常、数値タイプの選択肢です。以前は整数が選択の武器でしたが、最新のプロセッサでは浮動小数点のパフォーマンスが整数を上回っています。10進数はすぐです。


現代のほとんどすべてのシステム(携帯電話を含む)は、倍のハードウェアサポートを備えています。ゲームに単純な物理演算さえあれば、doubleとfloatの大きな違いに気付くでしょう。(たとえば、単純な小惑星のクローンで速度/摩擦を計算すると、2倍になると、加速度はフロートよりもはるかに流動的に流れるようになります
。-

doubleもfloatのサイズの2倍です。つまり、2倍のデータをかき混ぜる必要があるため、キャッシュのパフォーマンスが低下します。いつものように、それに応じて測定して続行します。
ヨーヨー

7

Decimal、Double、およびFloat変数タイプは、値を格納する方法が異なります。精度は、floatが単精度(32ビット)浮動小数点データ型、doubleが倍精度(64ビット)浮動小数点データ型、10進数が128ビット浮動小数点データ型の場合の主な違いです。

フロート-32ビット(7桁)

ダブル-64ビット(15-16桁)

10進数-128ビット(有効数字28〜29桁)

詳細... Decimal、Float、Doubleの違い


5

これらすべてのタイプの問題は、特定の不正確さが存在すること、およびこの問題が次の例のように小さい10進数で発生する可能性があることです。

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If

質問:bLower変数にはどの値が含まれていますか?

回答:32ビットマシンでは、bLowerにはTRUEが含まれています!!!

DoubleをDecimalに置き換えると、bLowerにFALSEが含まれます。これが適切な答えです。

doubleでは、問題は、1.1よりも低いfMean-fDelta = 1.09999999999です。

注意:Decimalは倍精度が高く、精度が常に制限されているため、他の数値でも同じ問題が確実に存在する可能性があると思います。

実際、Double、Float、DecimalはCOBOLのBINARY decimalに対応しています!

COBOLで実装されている他の数値型が.Netに存在しないのは残念です。COBOLを知らない人のために、COBOLには以下の数値型が存在します

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 

4

簡単な言葉で:

  1. Decimal、Double、およびFloat変数タイプは、値を格納する方法が異なります。
  2. 精度は主な違いです(これは単一の違いではないことに注意してください)。floatは単精度(32ビット)浮動小数点データ型、doubleは倍精度(64ビット)浮動小数点データ型、decimalは128ビットです。浮動小数点データ型。
  3. 要約表:

/==========================================================================================
    Type       Bits    Have up to                   Approximate Range 
/==========================================================================================
    float      32      7 digits                     -3.4 × 10 ^ (38)   to +3.4 × 10 ^ (38)
    double     64      15-16 digits                 ±5.0 × 10 ^ (-324) to ±1.7 × 10 ^ (308)
    decimal    128     28-29 significant digits     ±7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
詳しくFloatDoubleDecimalをご覧ください


この回答は、既存の回答でまだカバーされていないことを何に追加しますか?ところで、「decimal」行の「or」は正しくありません。コピー元のWebページのスラッシュは、代替ではなく分割を示しています。
マークディキンソン

1
そして私は、精度が主な違いであると強く主張します。主な違いは、10進浮動小数点と2進浮動小数点の基本です。この違いはDecimal、金融アプリケーションに適したものであり、との間Decimalで決定するときに使用する主な基準Doubleです。Doubleたとえば、科学アプリケーションに精度が不十分であることはまれです(範囲が限られているため、科学アプリケーションにDecimal適さないことがよくあります)。
Mark Dickinson、

2

これらのそれぞれの主な違いは、精度です。

float32-bit数値、double64-bit数値、decimal128-bit数値です。


0
  • Decimal 128ビット(有効数字28-29桁)金融アプリケーションの場合、高精度が得られ、丸めエラーを簡単に回避できるため、Decimal型を使用することをお勧めします。お金と通貨)

  • ダブル 64ビット(15〜16桁)ダブルタイプは、金額の処理を除いて、実際の値に最もよく使用されるデータタイプです。最も正確な答えが不要な非整数演算にはdoubleを使用します。

  • フロート 32ビット(7桁)処理能力に対する要求が非常に高いため、ほとんどの場合グラフィックライブラリで使用され、丸めエラーに耐えられる状況も使用されます。

Decimalsに比べてはるかに遅いですdouble/float

DecimalsそしてFloats/Doubles一方、キャストせずに比較することはできませんFloatsDoublesすることができます。

Decimals また、エンコードまたは後続ゼロを許可します。


-1

.Net(c#)でDecimal、Float、Doubleを定義するには

次のように値を記述する必要があります。

Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;

結果を確認します。

そして、それぞれが占めるバイトは

Float - 4
Double - 8
Decimal - 12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.