当我使用 OleDbDataReader 将工作表读入 DataTable 时,浮点数会失去其精度。
我尝试强制 OleDb 将 excel 数据读取为字符串,但尽管数据现在包含在 DataRow 中,每个列都定义为 System.String,但它会降低精度(18.125 -> 18.124962832)。
知道如何避免这种行为吗?
当我使用 OleDbDataReader 将工作表读入 DataTable 时,浮点数会失去其精度。
我尝试强制 OleDb 将 excel 数据读取为字符串,但尽管数据现在包含在 DataRow 中,每个列都定义为 System.String,但它会降低精度(18.125 -> 18.124962832)。
知道如何避免这种行为吗?
我刚刚测试了您的数据,并且此处发布的此方法有效。
即单元格值在放入DataSet 时保持其精度18.124962832。
我很确定 Jet 会根据它在前五行中看到的内容为每一列分配一个数据类型。如果前五行之后的某些内容不属于该数据类型,它将转换它或根本不返回任何内容。
电子表格的前五行的精度是否低于开始截断的项目?
看看这个帖子。
下面代码的输出显示了如何使用SpreadsheetGear for .NET获取基础数字和格式化文本:
这是代码的输出:
x=18.124962832 y=18.124962832 formattedText=18.125
这是代码:
namespace Program
{
class Program
{
static void Main(string[] args)
{
// Create a new workbook and get a reference to Sheet1!A1.
var workbook = SpreadsheetGear.Factory.GetWorkbook();
var sheet1 = workbook.Worksheets[0];
var a1 = workbook.Worksheets[0].Cells["A1"];
// Put the number in the cell.
double x = 18.124962832;
a1.Value = x;
a1.NumberFormat = "0.000";
double y = (double)a1.Value;
string formattedText = a1.Text;
System.Console.WriteLine("x={0} y={1} formattedText={2}", x, y, formattedText);
}
}
}
您可以在此处查看实时 SpreadsheetGear 示例并在此处下载免费试用版。
免责声明:我拥有 SpreadsheetGear LLC