2015-02-04 3 views
2

У меня небольшая проблема с двойным значением на моем листе excel. Двойное значение является результатом вычисления макросов. Отображается в ячейке как 1.0554. Формат ячейки - это номер с 4 десятичными знаками. Если я выберу более десятичное число, он будет отображаться с завершающим 0s (E.G. 1.05540000).Число с плавающей запятой в Excel

Моя проблема в том, что я читаю этот файл с помощью jxls (который использует Apache POI), а значение, которое я получаю, не 1.0554, а 1.0554000000000001 (последний 1 на 16-й цифре).

Я конвертировал свои xls в xlsx, проверяю непосредственно внутри xlsx (это zip-файл, содержащий xml-файлы, поэтому файл ascii), а сохраненное значение - 1.0554000000000001; но даже если я отформатирую свою ячейку как число с 32 десятичными знаками, excel по-прежнему отображает 1.0554000...000 без каких-либо задержек 1.

Так что я полагаю, что в xls реальное число также сохраняется как 1.0554000000000001, а не 1.0554.

Итак, как отображать в excel значение реального сырья? или заставить excel сохранить 1.0554 вместо 1.05540000 ... 01? Или проверить с макросом, что отображаемое значение не является исходным значением? ...

+0

Я внес несколько незначительных изменений в этот вопрос - в основном, для незначительных поправок в грамматике (ничего значительного, ваш английский довольно хорош). Просто отметьте, что я изменил «Leading» на «Trailing». Отображается с ведущими 0 будет выглядеть так: '00001.0554', в то время как конец 0 будет выглядеть так:' 1.05540000'. Это не слишком важно, но это может привести к путанице в будущем. – Pokechu22

+0

Прочтите эту [ссылку] (http://superuser.com/questions/522106/why-does-an-excel-column-formatted-as-number-lose-its-leading-zero-when-the-colu), возможно, это может вам помочь. – zoit

ответ

1

Вы столкнулись с богами IEE754. Двойные значения имеют 1 знаковый бит, 11 бит экспоненты и 52 бита мантиссы (фактическое представление немного сложнее, но то, что вы должны отнять у него, состоит в том, что число 1.0554 не выражается правильно в пределах 52 бит, поэтому двойной реализация вашего ПК выбирает ближайшее значение.

1

плавающей ошибка точки округления приходит в игру, как только вы преобразовать число, которое не может быть представлено точно. Она имеет тенденцию к увеличению, как вы делаете расчеты.

ближайшим представимо значение до 1.0554 составляет 1.0553999999999998937738610038650222122669219970703125. Ближайшее представимое значение до 1.0554000000000001 составляет 1.055400000000000115818465928896330296993255615234375 - это, вероятно, то, что вышло из вашего расчета макросов. Плохая новость в том, что вы не получаете именно то значение, которое вы имели в виду. Хорошей новостью является то, что различие часто, как и в этом случае, слишком мало, чтобы иметь значение или даже быть измерено в реальной жизни.

Как правило, вы не хотите, чтобы точное значение печаталось. Поведение по умолчанию toString в Java - это создание кратчайшего десятичного расширения, которое преобразуется во внутреннее значение. Это также обычно не то, что вы хотите для дисплеев конечных пользователей.

Правильная вещь, в большинстве случаев, именно то, что вы делаете в Excel - отображать только цифры, которые, по вашему мнению, имеют значение для того, что вы делаете. В Java вы можете использовать DecimalFormat для преобразования double в String с контролем над отображаемыми цифрами.

Смежные вопросы