Я использую библиотеку SQLite .NET для сохранения двойников
Это мой псевдокод
// create table t1 (value REAL)
// ... connect to db
var sql = $"insert into t1(value) VALUES ({double.MaxValue:G64})"; // insert into t1(value) VALUES (1.7976931348623157E+308)
using (var command = new SQLiteCommand(sql, con))
{
command.ExecuteNonQuery();
}
Затем я делаю выбор:
// SELECT * FROM t1
// .. connect + query
var d = reader.GetDouble(0);
Но значение d - это double.PositiveInfinity
, а не double.MaxValue
, в чем может быть причина разницы?
В любом случае лучше использовать параметры, так как текущий код сломается в любой системе, не использующей символ точки в качестве десятичного разделителя.
@Evk, у меня System.OverflowException
, я думаю, проблема в том, что double.MaxValue
в C# не то же самое, что std::numeric_limits<double>::max()
в C++
@ckuri, да, конечно, но double.MaxValue
не использует точку / запятую, проблема больше в том, что данные не были правильно сохранены ни в одной системе.
@SimonGoodman Верно. Если я запустил ваш код на своей немецкой машине, я получу «1,7976931348623157E + 308» - обратите внимание на запятую вместо точки.
@ckuri, я понимаю, что вы говорите (я смотрел на это как на целое число, а не на научную нотацию), но в любом случае это не совсем проблема, поскольку это не работает как целое / научное число или нет.
Возможно ошибки округления.
@CL., Нет, данные сохраняются как -Inf
или Inf
, я думаю, это связано с C++ max double vs C# max double. Они немного разные.
А если вы используете параметр вместо преобразования значения в строку во вставке?