Добрый день! Тема обсуждалась. Это связано с внутренними параметрами экселя по хранению и обработке чисел. При этом вы хотите округлить столбец 2, а проблема в столбце 3. Там вы разрешаете экселю считать так, как ему нравится. Округляйте данные при расчете. +макрос по округлению. Вы работая с числами пытались их обрабатывать как строку (текст).
Код
=ОКРУГЛ(СУММ($B$1:B1);3)
Sub ДлинаПослеЗапятой()
Dim r As Long, i As Long
'отключаем тормоза
With Application
.ScreenUpdating = False 'обновление экрана
.DisplayAlerts = False 'системные предупреждения
.EnableEvents = False 'контроль событий
.Calculation = xlManual 'автоматический пересчет формул
r = Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To r
Cells(i, 2).Value = WorksheetFunction.Round(Cells(i, 2).Value, 3) 'в ячейку А1 текущего листа вносишь число
Next i
'включаем все, что отключали
.Calculation = xlAutomatic '
.EnableEvents = True '
.DisplayAlerts = True '
.ScreenUpdating = True '
End With
End Sub
Дело в том что из этого файла только колона "В" с нужными данными, в остальных я искал ошибку. "А" - попытался при помощи VBA найти где скрылась число c большим чем 2 знака после 0, не очень получилось. "С" - просто суммирует =СУММ($B$1:B(n)) чтобы найти проблемную строку. При том формат "В" и "С" числовой. "D" - считает знаки после запятой в 2 колоне а "C" - считает знаки после запятой в 3 колоне, повторяюсь это только для поиска проблемы. В самом проекте просто сумма всех чисел в столбце "В" =СУММ(B:B), при том данные в колоне "В" технически у меня не могут быть с большим чем 2 знака после запятой. На счёт "WorksheetFunction.Round" полностью согласен, я не сохранился перед отправкой файла и получилось только Round, но это я написал только для проверки чисел 2 столбца, если бы появилась 3-я цифра после запятой, это означало что число не правильно записано, у меня категорически могут быть только 2 цифры после запятой и их сумма без всяких округлений должна получится с 2-я знаками после запятой.
Тема приближенных вычислений много раз обсуждалась на форуме. Дробные числа со знаменателем, отличным от степени двойки, не могут быть точно представлены в двоичной системе счисления и хранятся в формате double приближенно. Функция Round может лишь уменьшить погрешность. В вашем примере числа суммируются, при этом погрешность может вырасти. Вы можете уменьшить погрешность суммы, если формулы писать так:
=ОКРУГЛ(СУММ($B$1:B1);2) не могу использовать потому что может округлить либо в меньшую или в большую сторону а мне вторая цифра после запятой нужна точная, без всяких округлений
Format(cell, "#,##0.00") равен тому что я ставлю формат число 0,00 и в принципе показывает 2 знака но само число не проходит дальше потому что де-факто больше чем 2 знака а зная теорему что сумма целых чисел не может получится дробью получается ERROR. В проекте у меня 2я колонка и так Format(cell, "#,##0.00") и все полученные данные формата 0,00
Виктор Годунов написал: при том данные в колоне "В" технически у меня не могут быть с большим чем 2 знака после запятой.
Цитата
Виктор Годунов написал: не могу использовать потому что может округлить либо в меньшую или в большую сторону а мне вторая цифра после запятой нужна точная, без всяких округлений
Одно противоречит другому. При округлении до двух знаков после запятой никакой потери точности не будет. У Вас погрешность в примере после 6-знака после запятой.
Для минимизации в сумме ячеек погрешности округления можете также считать сумму нарастающим итогом, добавляя к предыдущему итогу текущее значение и округляя до 2 знаков после запятой.
и всё-таки я настаиваю что проблема в цифрах. Получаю я их из текста колдую над каждой, убираю лишние знаки, меняю "." на "," и записываю в формате Format(cell, "#,##0.00"). Секрет в том что у меня 2 колонки с одинаковым количеством цифр но с другим значением, и во 2 колонке всё в порядке. Сегодня попробовал каждую цифру * на 100 потом /100 потом суммировал в результате общая сумма с 2-я значениями после нуля
Виктор Годунов написал: Получаю я их из текста колдую над каждой
не нужно колдовать нужно изучить материальную базу оборудования, которым пользуетесь, один раз усвоить информацию об особенностях хранения чисел в компьютере и потом всю жизнь использовать полученные теоретические знания для решения практических задач