OleDbDataReader を使用してシートを DataTable に読み込むと、浮動小数点数の精度が失われます。
OleDb に Excel データを文字列として読み取らせようとしましたが、データは System.String として定義された各列を持つ DataRow に含まれるようになりましたが、精度が失われます (18.125 -> 18.124962832)。
この動作を回避する方法はありますか?
OleDbDataReader を使用してシートを DataTable に読み込むと、浮動小数点数の精度が失われます。
OleDb に Excel データを文字列として読み取らせようとしましたが、データは System.String として定義された各列を持つ DataRow に含まれるようになりましたが、精度が失われます (18.125 -> 18.124962832)。
この動作を回避する方法はありますか?
あなたのデータをテストしたところ、ここに投稿されたこの方法が機能しました。
つまり、DataSet に入れると、セル値は精度 18.124962832 を維持します。
Jet は、最初の 5 行の内容に基づいて、各列にデータ型を割り当てようとしていることは間違いありません。これらの最初の 5 行の後の何かがそのデータ型に当てはまらない場合は、それを変換するか、何も返しません。
スプレッドシートの最初の 5 行の精度は、最初に切り捨てられた項目よりも低くなりますか?
この投稿を見てください。
以下のコードからの出力は、 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 を所有しています