powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / При делении разные в c# и Excel разные результаты
19 сообщений из 19, страница 1 из 1
При делении разные в c# и Excel разные результаты
    #39588267
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Подскажите пожалуйста что за ерунда, почему результаты разнятся с Excel?

C#
249.93 * (decimal)Math.PI / 180 = 4,362101399509423415

Excel
249.93 * ПИ() / 180 = 4,36215957715116

4,362101399509423415 / C#
4,36215957715116 / Excel
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588280
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

Nechto249.93 * (decimal)Math.PI / 180

в C# вот это не скомпилится, так что...
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588290
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechto,

Nechto249.93 * (decimal)Math.PI / 180

в C# вот это не скомпилится, так что...


перепутал double, а не decimal

249.93 * (double)Math.PI / 180
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588292
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

в Excel ПИ() = 3,141592654
в C#//NET = 3,1415926535897931

ещё вопросы? ))
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588302
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechto,

в Excel ПИ() = 3,141592654
в C#//NET = 3,1415926535897931

ещё вопросы? ))

Пробовал подставлять пи который в Excel в С# результат все равно не сходится.
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588303
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Excel 2007
3,14159265358979 // ПИ()
4,36210139950943 // 249,93 * ПИ() / 180

C#
3.1415926535897931 // Math.PI
4.3621013995094273 // 249.93 * Math.PI / 180
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588307
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoПробовал подставлять пи который в Excel в С# результат все равно не сходится.

что не сходится?
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588316
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому, что при работе с числовыми типами с плавающей запятой использование оператора равенства недопустимо.
На разных процессорах у вас может получиться разный результат
у меня выражение в C# возвращает "249.93 * Math.PI / 180.0" возвращает 4.3621013995094273, а
в Excel 4.36210139950943.
в таких типах не бывает точных значений, так как практически все операции возвращают приближенные значения, арифметическая погрешность и чем больше операций, тем больше эта погрешность.
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588322
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoПробовал подставлять пи который в Excel в С# результат все равно не сходится.
4.3621013995094273 // C# = 249.93 * Math.PI / 180
4,3621013995094200 // Excel 2007 = 249,93 * 3,14159265358979 / 180
Похоже, в екселе отображается ограниченное количество знаков после запятой (в 2007-м = 14). Если просуммировать две одинаковые ячейки (= 249,93 * 3,14159265358979 / 180) то результат будет 8,7242027990188500 а не 8,7242027990188400, т.е. проблема в отображении...
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588325
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesв таких типах не бывает точных значений, так как практически все операции возвращают приближенные значения, арифметическая погрешность и чем больше операций, тем больше эта погрешность.
Ну как это не бывает точных значений? Есть стандарт IEEE 754, все значения там "точные", ибо любое значение - это "точное" (детерминированное) положение 64 бит.
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588357
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

формат представления числа тут при чём? я пишу о точности в вычислениях, а не о формате представления числа.
как я уже написал выше, на двух разных процессорах, можно получить 2 разных значения. Я уже не говорю про более сложные операции. Когда сравнивают 2 числа с плавающей точкой учитывают погрешность.
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588365
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, не знаю. У меня и шарп у эксель одинаковое число выдают: 4,36210139950943
офис 2017, студия тоже 2017, проект на шарпе под .NET FW 4.5
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588400
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У маня как не крути разные значения выдает

Пример 249,93 * 3.14159265358979 / 180

4,36210139950943 // Excel
4,36210139950942 // C#

Не знаю в чем проблема.
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588402
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoУ маня как не крути разные значения выдает

Пример 249,93 * 3.14159265358979 / 180

4,36210139950943 // Excel
4,36210139950942 // C#

Не знаю в чем проблема.
Ну, для чисел с плавающей запятой это норма
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588426
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Стандарт IEEE 754 включает в себя в т.ч. и описание операций двоичной арифметики. Т.е., не имеет значения, где реализована работа с этим стандартом (в железе или в софте, кстати, сейчас даже некоторые видеокарточки умеют с этим работать), результат вычисления выражения должен быть одинаковым везде и всегда. Не может быть, чтобы используя double, Excel и .Net вычисляли разный результат... А вот отображать они могут по-разному.
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588428
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NechtoУ маня как не крути разные значения выдает

Пример 249,93 * 3.14159265358979 / 180

4,36210139950943 // Excel
4,36210139950942 // C#

Не знаю в чем проблема.

COS(4,36210139950943) = -0,3431679388993890
Math.Cos(4,36210139950942) = -0.3431679388993954

SIN(4,36210139950943) = - 0,93927406315278700
Math.Sin(4,36210139950942) = -0.93927406315278439

В общем эта погрешность очень плохо! При округлении координат, точность координат может на метр улететь. При решение прямой и обратной геодезической задачи.

К примеру если обратная геодезическая задача была выполнена в C#, а прямая геодезическая задача в Excel.
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588527
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588555
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, вот и ответ
https://support.microsoft.com/ru-ru/help/78113/floating-point-arithmetic-may-give-inaccurate-results-in-excel Мантисса и показатель степени сохраняются в отдельных компонентах. В результате возможная точность различается в зависимости от размера обрабатываемого числа (мантиссы). В случае с Excel, хотя эта программа может сохранять числа от 1,79769313486232E308 до 2,2250738585072E-308, обеспечивается точность только до 15 знака. Это ограничение является прямым следствием строго соблюдения спецификации IEEE 754, а не ограничением программы Excel. Таким же уровнем точности обладают и другие программы для работы с электронными таблицами.
Nechto,
т.о., придется либо обеспечить аналогичное ограничение для работы с double (15 знаков) в .Net, либо, если округление значений в задаче недопустимо, отказываться от double+excel и использовать, например, decimal в .Net
...
Рейтинг: 0 / 0
При делении разные в c# и Excel разные результаты
    #39588602
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как только мантиссе потребуется больше 52 бит ("вширь"), мы потеряем точность
Код: c#
1.
2.
var pow2of53 = Math.Pow(2, 52 + 1); // 9007199254740992
double x = 9007199254740993; // 9007199254740992.0 !!! отбрасывается "наименее значимый" бит


А ограничение 15 знаков гарантирует что мантисса поместится на 52 битах (+ 1 виртуальный для единички).
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / При делении разные в c# и Excel разные результаты
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]