Как Excel правильно отображает десятичные значения, хотя в файлах workheet.xml и styles.xml не хранится информация о точности десятичных чисел?

Вот шаги, которым я следую, чтобы изучить поведение:

1 # Создайте файл Excel (xlsx), поместите 1234.56789 в ячейку, сохраните его.
2 # Извлеките файл .xlsx, посмотрите файлы sheet1.xml и styles.xml.

В xl / worksheets / Sheet1.xml вы увидите следующее:

<sheetData><row r="1" spans="1:1" x14ac:dyDescent="0.25"><c r="A1" s="1"
<v>25778.567889999998</v>
</c></row></sheetData>

И в Styles.xml нет информации о точности исходного числа, равного 1234.56789.

Как Excel показывает исходное значение, когда мы открываем его в MS Excel?
Как он восстанавливает исходное число, хотя в извлеченных файлах нет информации?

Обратите внимание, что я не менял тип формата ячейки или что-то еще, поэтому формат ячейки является общим.

Я понимаю, что, поскольку Excel сохраняет число как с плавающей запятой, он не может сохранить значение с идеальной точностью, я не могу понять, как он сохраняет исходное значение, когда я открываю его в MS Excel. Я столкнулся с проблемой чтения файлов Excel с помощью OpenXML SDK, но прежде чем спрашивать об этой проблеме, я ищу ответ на этот более фундаментальный вопрос.


person Thunderstruck    schedule 14.01.2015    source источник
comment
@pnuts извини, что удалил ошибку. Я столкнулся с этим вопросом, пытаясь проанализировать такие десятичные значения, но теряя точность, использовал OpenXML sdk с C #, поэтому по ошибке добавил этот тег, хотя он не имеет отношения к вопросу.   -  person Thunderstruck    schedule 14.01.2015
comment
Может ли это быть совпадением? Вероятно, есть какой-то алгоритм отображения, который видит много девяток в конце и одновременно обрезает их, округляя их в большую сторону.   -  person Andrew Savinykh    schedule 14.01.2015
comment
@pnuts спасибо за замечание. Да, я знаю, что вы ответили на один из двух других связанных вопросов, которые я сегодня разместил. Похоже, что пока никто не ответил ни на один из вопросов. Я собираюсь назначить награду, нужно еще 1 балл, чтобы иметь право сделать это :)   -  person Thunderstruck    schedule 14.01.2015


Ответы (1)


Он просто ограничивает точность ввода до 15 цифр, например попробуйте поместить 25778.567889999955 в ячейку и увидите, что он немедленно преобразуется (в самом Excel) в 25778.5678899999, а 1.23456789123456789 становится 1.23456789123456. Дополнительные сведения о внутреннем устройстве числового представления и его влиянии на вычисления см. В этой замечательной статье в Википедии.

person dewaffled    schedule 14.01.2015
comment
Да, я знаю это, и этот ответ не относится к сценарию, который я изложил выше. Моя исходная запись состоит из 9 цифр с точностью до 5. И sheet1.xml сохраняет как 17-значное число с плавающей запятой, что, конечно, неточно, с точностью до 14. Мой вопрос заключался в том, как MS excel восстанавливает это точное 9-значное число из 17-значного. значение в sheet.xml? Если бы это было округлено только до предела в 15 цифр, исходное значение из 9 цифр не было бы восстановлено. - person Thunderstruck; 14.01.2015
comment
Кстати, спасибо за ссылку на статью! - person Thunderstruck; 14.01.2015
comment
@Thunderstruck 25778.567889999998 с округлением до 15 цифр дает 25778.5678900000 или 25778.56789 без конечных нулей - person dewaffled; 14.01.2015