2012-04-24 18 views
0

Excelシートから値8.03をコピーし、以下のコードを使用してクリップボードからその値をC#で読み取っています。出力される値は8.0299999999999994であり、8.03ではありません。下のようにxmlを見ると、値は8.0299999999999994です。 xlsxのzipファイルにあるsheet1.xmlの値も8.02999999999999994です。しかし、値をメモ帳にコピーすると、値は8.03にコピーされます。メモ帳のように値を8.03にコピーするにはどうすればよいですか?コピーされた小数点以下の値をExcelから読み取る

DataObject retrievedData = Clipboard.GetDataObject() as DataObject; 
    if (retrievedData.GetDataPresent("XML Spreadsheet")) 
    { 
     var sourceDataReader = new XmlTextReader(retrievedData.GetData("XML Spreadsheet") as System.IO.Stream); 
     var doc = XDocument.Load(reader); 
     var excelWorksheeet = doc.Element("Worksheet"); 
     XNamespace ns = "urn:schemas-microsoft-com:office:spreadsheet"; 
     XName worksheetName = ns + "Worksheet"; 
     var worksheetElement = doc.Root.Element(worksheetName); 
    } 

worksheetElementが値を持っている:

<Worksheet ss:Name="Sheet1" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns="urn:schemas-microsoft-com:office:spreadsheet"> 
    <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" ss:DefaultRowHeight="15"> 
    <Row> 
     <Cell> 
     <Data ss:Type="Number">8.0299999999999994</Data> 
     </Cell> 
     </Row> 
    </Table> 
    </Worksheet> 
+6

[各コンピュータ科学者が浮動小数点演算について知っておくべきこと](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

答えて

1

クリップボードには、いくつかのフォーマットをサポートしています。明らかに、XML Spreadsheet形式は、Excelの場合とは異なる浮動小数点値の丸めを行います。メモ帳とまったく同じようにデータを取得する場合は、代わりにtext表現を取得してみてください。

もちろん、textとしてコピーすると、XML Spreadsheetのすべての詳細情報が得られるわけではありませんが、データの処理内容によって異なります。

代わりに、両方の表現を取得することもできます。 XML Spreadsheet形式を取得して詳細データを取得し、text形式を使用して表示文字列を取得します。

関連する問題