当我使用 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());
}
}
}
}
}
我使用 Object 类型,因为我不知道它可能是哪种实际类型。所以,就在做 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