2016-07-28 19 views
-1

誰でもこの問題を解決できますか?C#での小数点から浮動小数点への変換の問題

私はデータベースに、Entity Frameworkが "float"として表すnull可能な "実際の"列を持っています。

システムでは10進数で計算されますが、この列に値を代入すると精度が失われます。システムは、次の変換を使用している

dbObject.floatCol = (float) decimalVar; 

decimalVarは= 123.12341

ですがdbObject.floatColは= 123.1234

私は運のない他の方法でこのconvertionをやろうとしています。

注:データベースで

  1. 私は問題なく123.12341に値を更新することができます。
  2. 私は、.NET Frameworkを使用してのVisual Studio 2010を使用しているデータベースの列
  3. を変更することはできません4

EDIT:
私は(私の問題の実数で)問題をデバッグする場合私が持っている:

decimal decimalVar = new decimal(123.13561); 
// decimalVar is 123.13561 
float? floatVar = 0; 
// floatVar is 0 
floatVar = (float)decimalVar; 
// floatVar is 123.135612 <- has appeared a 2 at the end 

// with a different decimal number 
decimalVar = new decimal(128.13561); // replaced the 123 for 128 
// decimalVar is 128.13561 
floatVar = (float)decimalVar; 
// floatVar is 128.1356 <- has disappeared the 1 at the end 

行動は本当に奇妙な
である私はPにしようとしたとき、私は正しい変換
を行うことが可能であるかどうかを知る必要があり値をコンソールまたはログファイルに書き戻します。これらは異なります。■

+0

C#とのSQLServerの間の型マッピングで見るジョンスキートの記事を見つけることができる[ここ](https://msdn.microsoft.com/en-us/library/cc716729(V = VS.100 ).aspx) –

答えて

2

精度は約7桁です。これはあなたがC#floatから期待できるものです。精度が必要な場合は、代わりにC#doubleの値を使用してください。それは約15〜16桁の精度を提供します。

double d = (double)decimalVar; 

また、C#データ型とデータベースデータ型を変更する必要があります。 C#では、db decimal列の読み取りに最適なデータ型はdecimalです。

データベース型によっては、数値型の列に異なる名前が使用されます。これらの名前はC#の種類とは異なります。 SQLサーバーfloatは、C#doubleに対応しています。 SQLサーバーrealは、C#float(.NET Single)に対応しています。

を参照してください:あなたのEDITに関するSQL Server Data Type Mappings

floatdouble値が最も近い一致するバイナリ値に丸められ小数を必要とし、内部で浮動小数点数としてバイナリ表現を持っています。このバイナリ値は、表示のために10進表現に変換されます。値が切り上げられたか、または切り捨てられたかによって、小数点が追加または削除される可能性があります。これはあなたが経験したものです。

Binary floating point and .NET

+0

答えをいただきありがとうございます、私はデータベースの種類を変更する以外の選択肢がないと思います。 奇妙なことです:データベースの値を123.12341に更新できます。float var = 123.12341fを定義できますが、小数点から浮動小数点への変換は正しくできません。 –

+0

また、使用される書式によって異なります。数字はまだ最後の '1'が保存されていますが、デフォルトでは表示されません。数字を明示的に指定して、変換された値を表示するようにしてください: 'x.ToString(" 0.000000 ")'。 –

+0

サンプルコードを追加して質問を編集しました –

関連する問題