.NET 代码向存储在 Oracle DB 中的具有 1 或 3 个小数位的数字添加尾随 0

.NET code adds a trailing 0 to the numbers with 1 or 3 fractional digits stored in Oracle DB

我 运行 .NET 中的 SELECT 查询(使用 OracleDataAdapter)和 SQL 开发人员。结果集略有不同:

SQL 开发人员 returns:

.NET returns:

如您所见,在点后有 1 位或 3 位的值的末尾有一个额外的 0。这个问题的根本原因是什么以及如何预防?

我们可以轻松删除代码中多余的 0,但我们希望通过修复潜在问题来防止它发生。谢谢!

更新(2018 年 1 月 29 日):

Oracle 中的数据类型:

这是获取数据的 .NET 代码:

OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);

if (conn.State != ConnectionState.Open)
    conn.Open();

DataSet hereDataSet = new DataSet();

try
{
    using (OracleCommand oCmd = new OracleCommand())
    {
        oCmd.Connection = conn;
        oCmd.CommandText = "select V_COLUMN from T_TABLE where V_COLUMN='123'"; 

        OracleDataAdapter oDataAdapter = new OracleDataAdapter(oCmd);

        oDataAdapter.SelectCommand = oCmd;
        oDataAdapter.Fill(hereDataSet);
    }
}
catch (Exception ex)
{
    // exception logic
}
finally
{
    if (conn.State == ConnectionState.Open)
    { conn.Close(); }
}

根据 MSDN 文档:https://msdn.microsoft.com/en-us/library/fzeeb5cd.aspx

If format is null or an empty string, the return value of this instance is formatted with the general numeric format specifier (G).

我想你想做的是:

var asExpected = oracleDataReader.GetDecimal(0).ToString("G0");

Oracle 以不同方式存储数字。例如,您确定在转到 .net decimal 时从 oracle 取回的数字不是 33641.70000000000001。您可能希望使用调试器将一行放入常规变量并将鼠标悬停在它(而不是 ToString)上以找出...如果是这样,您的解决方案因为您只需要 3 位小数将明确舍入到 3。我以前不得不这样做。

我创建了一个 Oracle 支持票。他们告诉我这是一个BUG