Функция Round
Re: Функция Round
Здравствуйте,
Точных время сказать не можем.
Вопрос по теме отрицательных нулей доработан.
Спасибо.
Точных время сказать не можем.
Вопрос по теме отрицательных нулей доработан.
Спасибо.
Re: Функция Round
Здравствуйте. Прошло уже порядком времени с момента вашего ответа. Скажите, есть ли какая-то информация по вопросу?
Сколько бы мы не возвращались к этой теме - что-то все равно не сходится.
Сколько бы мы не возвращались к этой теме - что-то все равно не сходится.
Re: Функция Round
Здравствуйте,
Занимаемся данной проблемой, о результатах дадим знать.
Спасибо.
#14894
Занимаемся данной проблемой, о результатах дадим знать.
Спасибо.
#14894
Re: Функция Round
Здравствуйте. Прошло уже 37 дней (последний вопрос был задан ещё 25.06), вы можете дать хотя бы общую информацию: вы подтверждаете наличие проблемы? в чем именно она заключается? может быть мы можем что-то сделать со своей стороны?
Re: Функция Round
Здравствуйте,
Обсуждаемая тут тема - это не ошибка продукта, а особенности реализации математических операций в разных системах.
Мы внимательно перечитали нашу переписку, проанализировали ваш пример отчета, и хотим уточнить вам следующие нюансы.
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)
Спасибо.
Обсуждаемая тут тема - это не ошибка продукта, а особенности реализации математических операций в разных системах.
Мы внимательно перечитали нашу переписку, проанализировали ваш пример отчета, и хотим уточнить вам следующие нюансы.
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
Здравствуйте. Благодарю за ответ, в течении следующей недели мы протестируем работу такого подхода и отпишемся о результатах
Re: Функция Round
Здравствуйте. Протестировали ваш вариант, он работает корректно и выводит ожидаемое значение в ячейку. Однако за ним следует один момент - при выгрузке отчета в ексель туда попадает не полное значение, а уже округленное, что для нас неприемлемо. Однако можно исправить это, указав отдельно в Excel.Value сырое значение. В таком случае проблема заключается в количестве отчетов, которые нужно переписать.
Скажите, нельзя ли создать опцию StiOptions.Engine, в которой можно будет переопределить округление по умолчанию, которое применяется при указании формата ячейки (в частности интересует числовой формат, 2-3 знака после запятой)?
Такой подход сократил бы количество переписываемого кода до одной строчки, при этом все останется валидно. Либо, как вариант, можно сразу прописать в округление при форматировании ячейки - ваш метод Round, вместо Math.Round который там применяется сейчас.
Скажите, нельзя ли создать опцию StiOptions.Engine, в которой можно будет переопределить округление по умолчанию, которое применяется при указании формата ячейки (в частности интересует числовой формат, 2-3 знака после запятой)?
Такой подход сократил бы количество переписываемого кода до одной строчки, при этом все останется валидно. Либо, как вариант, можно сразу прописать в округление при форматировании ячейки - ваш метод Round, вместо Math.Round который там применяется сейчас.
- Вложения
-
- Как видно, новый способ отработал как и ожидалось, однако тут же видно, что при обычном числовом формате - округление кривое
- Снимок экрана 2024-08-05 110733.png (41.39 КБ) 4363 просмотра
-
- Сообщения: 78
- Зарегистрирован: 07 сен 2021, 13:18
Re: Функция Round
Здравствуйте,
Мы приносим извинения за задержку, но нам нужно дополнительное время, чтобы тщательно изучить проблему.
Мы проинформируем вас о результатах как можно скорее.
Благодарим вас за терпение.
Мы приносим извинения за задержку, но нам нужно дополнительное время, чтобы тщательно изучить проблему.
Мы проинформируем вас о результатах как можно скорее.
Благодарим вас за терпение.
Re: Функция Round
Здравствуйте. У вас какие-то проблемы по этому вопросу? У меня складывается впечатление что вы отвечаете мне только в случае если я вам пишу. Могу я чем то поспособствовать вашим ответам?
-
- Сообщения: 78
- Зарегистрирован: 07 сен 2021, 13:18
Re: Функция Round
Здравствуйте,
Имеется в виду, когда для ячейки выбираете TextFormat -> Number, и там количество знаков после запятой автоматически ставилось определённое?
Спасибо.
Так и задумано. По умолчанию в экспорте должно быть то же что и в превью. Если надо более точное - указываете в ExcelValue.Здравствуйте. Протестировали ваш вариант, он работает корректно и выводит ожидаемое значение в ячейку.
Однако за ним следует один момент - при выгрузке отчета в ексель туда попадает не полное значение, а уже округленное, что для нас неприемлемо.
Однако можно исправить это, указав отдельно в Excel.Value сырое значение.
Не совсем понятен вопрос.В таком случае проблема заключается в количестве отчетов, которые нужно переписать.
Скажите, нельзя ли создать опцию StiOptions.Engine, в которой можно будет переопределить округление по умолчанию,
которое применяется при указании формата ячейки (в частности интересует числовой формат, 2-3 знака после запятой)?
Имеется в виду, когда для ячейки выбираете TextFormat -> Number, и там количество знаков после запятой автоматически ставилось определённое?
Технически там не применяется округление явно, там вызывается метод value.ToString(format), внутри которого уже сама система применяет округление при необходимости в зависимости от формата.Такой подход сократил бы количество переписываемого кода до одной строчки, при этом все останется валидно.
Либо, как вариант, можно сразу прописать в округление при форматировании ячейки - ваш метод Round, вместо Math.Round который там применяется сейчас.
Спасибо.