Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 25.01.2018
Сообщений: 3

Странное поведение сложения чисел double

25.01.2018, 16:40. Показов 5831. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Столкнулся с такой проблемой.
Если последовательно прибавлять к переменной типа double дробное число, то в какие-то моменты оно ломается.
Например:
C#
1
2
3
4
            for (double i = -5; i < 2; i+=0.2)
            {
                Console.WriteLine(i);
            }
Выведет следующее:
Кликните здесь для просмотра всего текста
-5
-4,8
-4,6
-4,4
-4,2
-4
-3,8
-3,6
-3,4
-3,2
-3
-2,8
-2,6
-2,4
-2,2
-2
-1,8
-1,6
-1,4
-1,2
-0,999999999999998
-0,799999999999998
-0,599999999999998
-0,399999999999998
-0,199999999999998
2,16493489801906E-15
0,200000000000002
0,400000000000002
0,600000000000002
0,800000000000002
1
1,2
1,4
1,6
1,8


При этом если менять начальное значение - то и ломается оно в разных местах.
Сначала подумал что в механизме итерации что-то работает не тек как надо, и он не рассчитан на дробный шаг.
Но следующий код даёт тоже самое:
C#
1
2
3
4
5
6
            double x = -5;
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(x);
                x += 0.2;
            }
Как быть?
Можно конечно округлять число до десятых после каждой итерации - но это не выход.

Кто подскажет в чём проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2018, 16:40
Ответы с готовыми решениями:

Странное поведение double при сложении
Добрый вечер. Столкнулся с шокирующей для себя новостью. Я не умею считать!!! Есть форма из 2х textBox в которой водятся переменные a и...

Странное поведение чисел
Всем привет! Делаю калькулятор(такой же как в Win XP), так вот когда хочу например штобы решило выражение (2.4 - 0.6) он выводит мне...

Метод для сложения двух чисел double
Всем привет! Помогите с кодом пожалуйста. double a = 65.000; double b = 100; нужен метод. при вызове которого, int b...

7
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
25.01.2018, 16:51
Цитата Сообщение от ExGod Посмотреть сообщение
Кто подскажет в чём проблема?
В представлении числа в памяти.
https://docs.oracle.com/cd/E19... dberg.html
0
0 / 0 / 0
Регистрация: 25.01.2018
Сообщений: 3
25.01.2018, 16:56  [ТС]
Добавлено через 1 минуту
Цитата Сообщение от Sanya_sa Посмотреть сообщение
В представлении числа в памяти.
https://docs.oracle.com/cd/E19... dberg.html
А для начинающих, в двух словах можно?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.01.2018, 16:58
Цитата Сообщение от ExGod Посмотреть сообщение
А для начинающих, в двух словах можно?
Любое число, представленное в памяти в формате IEEE-754, будет иметь ошибки представления для любых значений, не являющихся множителем степени двойки.
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
25.01.2018, 16:59
Лучший ответ Сообщение было отмечено ExGod как решение

Решение

Цитата Сообщение от ExGod Посмотреть сообщение
А для начинающих в двух словах можно?
Ну если прям совсем в 2х словах, то не каждое число можно представить в формате double
некоторых двоичных мантиссы просто не существует (смотрите представление числа плавающей точкой).
Поэтому берется ближайшее к значению. Следовательно возникает погрешность.
1
0 / 0 / 0
Регистрация: 25.01.2018
Сообщений: 3
25.01.2018, 17:00  [ТС]
Это получается я ни когда не могу быть уверен что код отработает именно так как он должен отработать и вместо числа "1" в нужном месте я не получу "0.999999999999"?
0
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
25.01.2018, 17:01
Лучший ответ Сообщение было отмечено ExGod как решение

Решение

Здесь твои ответы
2
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.01.2018, 17:01
Если коротко, то процессор не умеет работать с числами с плавающей запятой. Имея double число 2.0, не значит, что оно такое и будет. Возможно где-то проскочит 2.00000...01, и все, совершенно другое число.

Поэтому с ними нужно работать осторожней, и не прибегать к таким операциям, как например сравнение, которое заменяется CompareTo().
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2018, 17:01
Помогаю со студенческими работами здесь

Странное поведение. Генерация случайных чисел, сумма цифр = 3
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; int main (void) { int a, sum = 0, tmp;...

Странное поведение First
Приветствую всех! Есть такая выборка из основной таблицы: SELECT Поставки.Код_товара, Поставки.Срок_поставки, Поставки.Стоимость_единицы ...

WD 1,5 ТБ странное поведение
Привет В общем, есть такой расклад Железо: SSD под основную ОС (win7) и обычный HDD (WD, 1,5 тБ) под резервную (Win10) HDD...

Странное поведение if
День добрый. Работаю в VS. Столкнулся с тем, что условие if (signal.size() - len_st&gt;0) в коде используется не правильно. В этой...

Странное поведение
Добрый день! Имеется класс с мейном: public class Main { // args - is path to file with first and last words // args -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru