Страница 3 из 4

Re: Функция Round

Добавлено: 02 июл 2024, 10:11
Aleksey
Здравствуйте,

Точных время сказать не можем.

Вопрос по теме отрицательных нулей доработан.

Спасибо.

Re: Функция Round

Добавлено: 15 июл 2024, 10:32
vea
Здравствуйте. Прошло уже порядком времени с момента вашего ответа. Скажите, есть ли какая-то информация по вопросу?
Сколько бы мы не возвращались к этой теме - что-то все равно не сходится.

Re: Функция Round

Добавлено: 16 июл 2024, 10:32
Aleksey
Здравствуйте,

Занимаемся данной проблемой, о результатах дадим знать.

Спасибо.
#14894

Re: Функция Round

Добавлено: 02 авг 2024, 09:54
vea
Здравствуйте. Прошло уже 37 дней (последний вопрос был задан ещё 25.06), вы можете дать хотя бы общую информацию: вы подтверждаете наличие проблемы? в чем именно она заключается? может быть мы можем что-то сделать со своей стороны?

Re: Функция Round

Добавлено: 02 авг 2024, 17:57
Aleksey
Здравствуйте,

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

Мы внимательно перечитали нашу переписку, проанализировали ваш пример отчета, и хотим уточнить вам следующие нюансы.

1. Опция "StiOptions.Engine.MidpointRounding" влияет ТОЛЬКО на НАШУ функцию Round. Эта опция никак не влияет на системную функцию Math.Round или на форматирование чисел, которое производится тоже системными средствами. В вашем примере отчета используется только Math.Round, поэтому использование этой опции в данном отчете ни на что не влияет.

2. Разница вычислений в Net и NetFramework. В NetCore начиная с версии NetCore3.0 были сделаны изменения, чтобы вычисления соответствовали стандарту "IEEE 754-2008". Соответственно результаты вычислений могут отличаться. Подробно изменения описаны в следующей статье:
https://devblogs.microsoft.com/dotnet/f ... -core-3-0/
Благодаря этому же стандарту в вычислениях появился и "отрицательный ноль", когда в результате операции Math.Round(-0.01, 0) получается не просто "0", а именно "-0".

Чтобы результаты вычислений были везде одинаковыми и прогнозируемыми, используйте способ, который мы приводили вам выше - установите значение опции и используйте нашу функцию Round с приведением типа к Decimal, например:
Round((decimal)(ваше_выражение) ,2)

Спасибо.

Re: Функция Round

Добавлено: 03 авг 2024, 15:47
vea
Здравствуйте. Благодарю за ответ, в течении следующей недели мы протестируем работу такого подхода и отпишемся о результатах

Re: Функция Round

Добавлено: 05 авг 2024, 11:08
vea
Здравствуйте. Протестировали ваш вариант, он работает корректно и выводит ожидаемое значение в ячейку. Однако за ним следует один момент - при выгрузке отчета в ексель туда попадает не полное значение, а уже округленное, что для нас неприемлемо. Однако можно исправить это, указав отдельно в Excel.Value сырое значение. В таком случае проблема заключается в количестве отчетов, которые нужно переписать.
Скажите, нельзя ли создать опцию StiOptions.Engine, в которой можно будет переопределить округление по умолчанию, которое применяется при указании формата ячейки (в частности интересует числовой формат, 2-3 знака после запятой)?
Такой подход сократил бы количество переписываемого кода до одной строчки, при этом все останется валидно. Либо, как вариант, можно сразу прописать в округление при форматировании ячейки - ваш метод Round, вместо Math.Round который там применяется сейчас.

Re: Функция Round

Добавлено: 07 авг 2024, 14:43
Max Shamanov
Здравствуйте,

Мы приносим извинения за задержку, но нам нужно дополнительное время, чтобы тщательно изучить проблему.
Мы проинформируем вас о результатах как можно скорее.

Благодарим вас за терпение.

Re: Функция Round

Добавлено: 15 авг 2024, 17:57
vea
Здравствуйте. У вас какие-то проблемы по этому вопросу? У меня складывается впечатление что вы отвечаете мне только в случае если я вам пишу. Могу я чем то поспособствовать вашим ответам?

Re: Функция Round

Добавлено: 16 авг 2024, 16:48
Max Shamanov
Здравствуйте,
Здравствуйте. Протестировали ваш вариант, он работает корректно и выводит ожидаемое значение в ячейку.
Однако за ним следует один момент - при выгрузке отчета в ексель туда попадает не полное значение, а уже округленное, что для нас неприемлемо.
Однако можно исправить это, указав отдельно в Excel.Value сырое значение.
Так и задумано. По умолчанию в экспорте должно быть то же что и в превью. Если надо более точное - указываете в ExcelValue.
В таком случае проблема заключается в количестве отчетов, которые нужно переписать.
Скажите, нельзя ли создать опцию StiOptions.Engine, в которой можно будет переопределить округление по умолчанию,
которое применяется при указании формата ячейки (в частности интересует числовой формат, 2-3 знака после запятой)?
Не совсем понятен вопрос.
Имеется в виду, когда для ячейки выбираете TextFormat -> Number, и там количество знаков после запятой автоматически ставилось определённое?

Такой подход сократил бы количество переписываемого кода до одной строчки, при этом все останется валидно.
Либо, как вариант, можно сразу прописать в округление при форматировании ячейки - ваш метод Round, вместо Math.Round который там применяется сейчас.
Технически там не применяется округление явно, там вызывается метод value.ToString(format), внутри которого уже сама система применяет округление при необходимости в зависимости от формата.

Спасибо.