2017-10-17 9 views
0

を作成した方法に応じて異なります。は、.NET小数点値をフォーマットすると、次のC#のコードを見てみましょう、それが

decimal value1 = 1234M; 
decimal value2 = 1234.00M; 
Console.WriteLine(value1 == value2); // True 
Console.WriteLine(value1);   // 1234 
Console.WriteLine(value2);   // 1234.00 

それらが異なる(異なるフォーマットさせることがvalue1value2の違いは何ですか小数点以下の桁数)?

これらは同じ値なので、同じようにフォーマットされると思います。 value2は何とか私が小数点以下2桁で作成したどこかに保存しますか?はいの場合は、どうすればそれを見て変更できますか?

+2

、それが価値で有効桁数を追跡することができ、 。 floatとdoubleとはまったく異なります。したがって、小数部に桁数を指定しなければ、正確であると分かっている数だけ表示されます。 –

+0

「私は彼らが同じ方法でフォーマットされていると思うよ」どちらの方法で期待しますか?最初の値に有効数字を追加したり、2番目の値から削除したりすると思いますか? –

+0

@DStanley 2つの値が等しい場合、同じ値をとる必要があります。彼らが一貫している限り、彼らがどのようにフォーマットされているかは本当に気にしません。これは予期しないことです。私は実際にそれを行うまで、小数の値がどのようにフォーマットされるのか知る方法がないように感じます。それが私に任せられていれば、浮動小数点型と同じようにデフォルトの書式設定を行い、重要でないゼロをすべて削除します。 –

答えて

1

内部的に10進数は浮動小数点数の型として格納されるため、仮数と指数を格納します。あなたのケースでは2つの数字が、違ったおおよそのようなものを保存されています。

decimal value1 = 1234M; 
// mantissa = 1234, exponent = 0 

decimal value2 = 1234.00M;  
// mantissa = 123400, exponent = 2 

.NETを使用して、指数に従って配置小数点と仮数「全体」を入手できますように、出力は、それが見えます。

+0

仮数値と指数値をどうにかすることはできますか?私の問題は、これらの値がそれぞれ異なる動作をする2つの異なるものであり、それらが同一ではないことを検出できることです。 'value1'が何らかの方法で動作し、' value2'が他のやり方で動作する場合、それらは私にとって等しい値ではありません。 –

+0

数学的には、1234と1234.00は等しいです。データ型は数値を表す抽象であり、数値は等しい。メモリ内の値の基礎となる表現が同じであるかどうかを確認することに関心がある場合は、10進データ型を使用するほとんどの人とは別の方法です。だから私はそれをテストできる単純な演算子はないと思う。しかし、値の内部表現を掘り下げてみることができます - この回答を参照してくださいhttps://stackoverflow.com/a/3801462/22194 – codeulike

+0

または 'float'を使用すると、内部が管理されていることを意味する正規化されていると思います1234と1234.00は同じ方法で格納されます。 – codeulike

1

あなたのやり方は、小数点以下の異なる精度を追加しました。

それは同様の主題は、ここに報告されている同じ形式

同じ値だがない:10進数は少し特殊ですAdjusting decimal precision, .net

+0

これはありがとう、私はスタックオーバーフローのどこかになければならないことを知っていた、私はそれを見つけることができませんでした。また、[この回答](https://stackoverflow.com/a/7983330/108374)は、この問題の興味深い解決策です。 –

+0

あなたは歓迎です –

関連する問題