Я хочу получить длину результата формулы, но он возвращается неправильно.
Например, я ставлю 1005 в ячейку A1, вставляю формулу =(A1/1000-FLOOR(A1/1000,1))*1000 в B1 и получается 5, это правильно. Но когда я помещаю формулу =LEN(B1) в ячейку C1, получается 16? Хуже того, формула =REPT(0,3-LEN(TEXT(B1,"0")))&(B1) или =REPT(0,3-LEN(TEXT((A1/1000-FLOOR(A1/1000,1))*1000,"0")))&((A1/1000-FLOOR(A1/1000,1))*1000) возвращает 004.99999999999989??🤔
Этот вопрос не ясен. Вы хотите получить длину текста, возвращаемого вычислением формулы? Если да, то не сделают ли это функции ДЛСТР и ТЕКСТ?
округлить результат.. прежде чем получить длину. ( :
@MarkFernandes Поскольку 5 находится в камере B1, мне просто интересно узнать, почему =LEN(B1) возвращается 16...
@TRX: я тоже не знаю, почему. Возможно, функция LEN пытается вычислить длину текста формулы, а не результат. Если функция LEN ошибочно работает в предположении о 2-байтовой кодировке Unicode, тогда как на самом деле используется 1-байтовая кодировка ASCII, то это может объяснить возвращаемое значение 16 [половина 32, 32 является символом формулы длина).


Причина, по которой =LEN(B1) возвращает 16, заключается в том, что значение в ячейке B1 может отображаться как 5, но на самом деле оно хранится внутри как 4.99999999999989 — и это число содержит 16 символов, когда LEN() оценивается как строка.
Вы можете убедиться в этом сами, многократно нажимая на кнопку «Увеличить десятичную дробь»:
Здесь на дисплее в конечном итоге достаточно десятичных знаков, чтобы отразить базовое значение (функция LEN игнорирует конечные нули — опять же, это нули отображения, а не сохраненные нули).
Вы также можете увидеть то же самое, если просто введете в ячейку следующую формулу:
=1.005-1
На самом деле в нем 19 символов, а не 16, потому что мы не умножали на 1000:
0.00499999999999989
Потеря точности отображаемого 5 до фактического сохраненного 4.99999999999989 действительно происходит из-за того, как работает математика с плавающей запятой, как упоминал BigBen.
См. также Математика с плавающей точкой не работает? для более широкого обсуждения.
Ошибка с плавающей запятой :-) Подробнее здесь и здесь.