Страницы: 1
RSS
Появление лишних знаков после 0, При суммировании ряда чисел округлённых 0,00 вдруг появляются числа 7 знаков после нуля
 
Помогите пожалуйста разобраться!
3823 строка, я пытался макросом насильно округлить ряд "B", оператором ROUD до 3 чисел после 0, ничего не помогает
Изменено: Виктор Годунов - 22.10.2022 13:42:24
 
WorksheetFunction.Round
 
Вопрос в том откуда в 3823 строке появляются лишние знаки после нуля
Изменено: Виктор Годунов - 22.10.2022 13:42:03
 
Добрый день! Тема обсуждалась. Это связано с внутренними параметрами экселя по хранению и обработке чисел. При этом вы хотите округлить столбец 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-я знаками после запятой.
Изменено: Виктор Годунов - 22.10.2022 15:55:28
 
Тема приближенных вычислений много раз обсуждалась на форуме.
Дробные числа со знаменателем, отличным от степени двойки, не могут быть точно представлены в двоичной системе счисления и хранятся в формате double приближенно. Функция Round может лишь уменьшить погрешность.
В вашем примере числа суммируются, при этом погрешность может вырасти. Вы можете уменьшить погрешность суммы, если формулы  писать так:
Код
=ОКРУГЛ(СУММ($B$1:B1);2)
Владимир
 
=ОКРУГЛ(СУММ($B$1:B1);2) не могу использовать потому что может округлить либо в меньшую или в большую сторону а мне вторая цифра после запятой нужна точная, без всяких округлений
 
Цитата
вторая цифра после запятой нужна точная, без всяких округлений
Может использовать функцию
Format(cell, "#,##0.00")
 
Format(cell, "#,##0.00") равен тому что я ставлю формат число 0,00 и в принципе показывает 2 знака но само число не проходит дальше потому что де-факто больше чем 2 знака а зная теорему что сумма целых чисел не может получится дробью получается ERROR. В проекте у меня 2я колонка и так Format(cell, "#,##0.00") и все полученные данные формата 0,00
Изменено: Виктор Годунов - 22.10.2022 16:49:06
 
Цитата
Виктор Годунов написал:
при том данные в колоне "В" технически у меня не могут быть с большим чем 2 знака после запятой.

Цитата
Виктор Годунов написал:
не могу использовать потому что может округлить либо в меньшую или в большую сторону а мне вторая цифра после запятой нужна точная, без всяких округлений

Одно противоречит другому. При округлении до двух знаков после запятой никакой потери точности не будет. У Вас погрешность в примере после 6-знака после запятой.

Для минимизации в сумме ячеек погрешности округления можете также считать сумму нарастающим итогом, добавляя к предыдущему итогу текущее значение и округляя до 2 знаков после запятой.
Изменено: sokol92 - 22.10.2022 19:52:45
Владимир
 
и всё-таки я настаиваю что проблема в цифрах. Получаю я их из текста колдую над каждой, убираю лишние знаки, меняю "." на "," и записываю в формате Format(cell, "#,##0.00"). Секрет в том что у меня 2 колонки с одинаковым количеством цифр но с другим значением, и во 2 колонке всё в порядке.
Сегодня попробовал каждую цифру * на 100 потом /100 потом суммировал в результате общая сумма с 2-я значениями после нуля  
 
Цитата
Виктор Годунов написал:
Получаю я их из текста колдую над каждой
не нужно колдовать
нужно изучить материальную базу оборудования, которым пользуетесь, один раз усвоить информацию об особенностях хранения чисел в компьютере и потом всю жизнь использовать полученные теоретические знания для решения практических задач
Изменено: Ігор Гончаренко - 25.10.2022 13:23:44
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ознакомьтесь с https://www.softelectro.ru/ieee754.html
 
Цитата
написал:
мне вторая цифра после запятой нужна точная
округляйте до 6 знаков:
Код
=ОКРУГЛ(СУММ($B$1:B3823);6)
тогда вряд ли появится погрешность во 2-ом знаке.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх