Ошибка точности чисел в Excel 2007 при сохранении в формате XML - PullRequest
3 голосов
/ 03 марта 2009

При сохранении документов в формате XML Spreadsheet 2003 с использованием Excel 2007 возникает странная проблема.

Кажется, что случайное изменение числовых значений, таких как "0,58", на "0,57999999999999996".

Что действительно странно, так это то, что вы НЕ МОЖЕТЕ увидеть эту проблему, когда находитесь в Excel. Это можно увидеть только при просмотре данных XML непосредственно из текстового редактора.

Кто-нибудь сталкивался с этим раньше? Если да, есть ли какое-то исправление или обходной путь?

Ответы [ 3 ]

4 голосов
/ 03 марта 2009

Excel сохраняет числовые данные в виде чисел с плавающей запятой. Число справа от десятичного знака (дробная часть) является только приблизительным. Обходной работы нет, 0,58 нельзя представить как число с плавающей запятой, которое точно равно 0,58.

При загрузке файла XML в этот момент вы должны преобразовать число обратно в число с плавающей запятой или, что еще лучше, в десятичный класс с фиксированной цифрой (например, десятичный в C #).

2 голосов
/ 04 марта 2009

Ключ в том, что Excel хранит числа как числа с плавающей запятой 2-го числа. Большинство десятичных дробей не могут быть представлены в виде чисел с плавающей запятой 2.

В некоторых ответах указано, что «0,58 не может быть представлено с плавающей запятой». Это неверно, так как 0.58 может быть представлен базовыми 10 числовыми типами с плавающей запятой, такими как тип .NET Decimal - конечно, это не приносит пользы, так как вы не можете изменить базовый тип, используемый для чисел в Excel.

Excel всегда отображает числа в строке формул, округленные до 15 значащих цифр точности. Таким образом, это число отображается как 0,58 в строке формул, даже если оно не «точно» 0,58 - и не может быть точно 0,58 из-за ограничений базового числового типа Excel.

Вы можете попробовать включить Точность, как показано (в Excel 2007 это можно найти в Параметры Excel -> Дополнительно -> При вычислении этой книги: -> Установить точность, как показано) - это может или не может заставить Excel округлять эту конкретную число при сохранении в XML, но это, по крайней мере, даст вам более последовательные результаты. Просто будьте осторожны, так как Precision As Displayed будет округлять числа, уже сохраненные в числовых ячейках (это не подлежит отмене), а также округлять результаты вычислений (эта часть не может быть отменена, поскольку ее отключение будет пересчитывать без округления). Отображаемая точность округляется в зависимости от числового формата, поэтому числовой формат «0,00» приведет к округлению до двух десятичных разрядов, но большинство десятичных дробей не могут быть представлены в системе счисления с основанием 2 в Excel, поэтому 0,58 все равно может дать вам то же самое вещь, когда написано в XML. Числа, отформатированные как «Общие», будут округлены до 15 значащих разрядов точности при включенном параметре «Точность как отображается».

0 голосов
/ 03 марта 2009

Число 0.58 - это то же число, что и 0.57999999999999996. То есть, разница равна 0 , или, если говорить по-другому, числа равны .

Теперь вы можете не согласиться, если вы используете «обычную» математику в старшей школе. Excel нет, а компьютеры вообще нет. Они используют конечный набор битов. Точное представление 0,58 в двоичном формате использует бесконечный набор битов, поэтому некоторые из этих битов теряются.

...