csharp ドライバーを使用して浮動小数点数を MongoDB に保存すると、正確に保存されません。私の番号が 1504.57 の場合、データベースの番号は同じになると思いますが、何らかの理由で 1504.56994628906 になります (MongoDB の Double 型を使用)。どうしたの?データを正確に保つには?
私のオブジェクトはすべてのフィールドをオブジェクト型として保持し、型に応じてオンザフライでキャストします。次に例を示します。
this.Values[i] = float.Parse(this.Values[i].ToString());
多分それがこの奇妙な行動の理由ですか?しかし、 this.Values[i] をキャストした後はかなり正確で、データベースでのみ損なわれます。ありがとう
アップデート。データをカプセル化するクラス: public class TransferredData { [BsonElement("_id")] [ScriptIgnore] public ObjectId Id { get; 設定; }
public class Data
{
public List<Object> Values { get; set; }
public DateTypes DataType { get; set; }
public void CastToType()
{
for (int i = 0; i < this.Values.Count; i++ )
{
if (this.DataType == DateTypes.Date)
{
DateTime dt = DateTime.Parse(this.Values[i].ToString());
this.Values[i] = dt.ToUniversalTime().Date;
}
else if (this.DataType == DateTypes.Other)
{
this.Values[i] = this.Values[i].ToString();
}
else if (this.DataType == DateTypes.Reading)
{
this.Values[i] = float.Parse(this.Values[i].ToString());
}
}
}
}
}
実際の型がわからないため、オブジェクト型を使用します。したがって、upsert を実行する直前に、このクラスにデータを入力してから、Cast メソッドを呼び出します。
Then I save it into db:
data = new TransferredData();
...
data.Values[1] = "1504.57"; // Because the input is always string
data.CastToType(); // Here data.Values[1] = 1504.57 - cool
TransferredDataCollection.Save<TransferredData>(data, SafeMode.True);
この後、データベースを調べると... 1504.56994628906 です