Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Неожиданный результат при мат. действиях с преобразованным форматом

3.0K
16 мая 2014 года
ka1n
10 / / 02.09.2004
Всем привет!

 
Код:
textBox15.Text += (Single.Parse("4434,56") - Single.Parse("4431,26")).ToString()
Никто не скажет почему результат данной операции: 3,300293
А не 3,3
  • Прочитал тему как "Неожиданный мат при действиях с преобразованным форматом" :-) от Freeman, 16 мая 2014 года
416
20 мая 2014 года
MaitreDesir
380 / / 02.01.2008
http://msdn.microsoft.com/ru-ru/library/364x0z75(v=vs.100).aspx
Если нужна идеальная точность - оперируй с правильными дробями :)

А вообще, поиск - это круто.
7
16 мая 2014 года
@pixo $oft
3.4K / / 20.09.2006
Очевидно, потому что точность типа Single не настолько высока, чтобы вычислять числа с такой точностью. Также стоит помнить про машинную точность в целом.
3.0K
18 мая 2014 года
ka1n
10 / / 02.09.2004
Цитата: @pixo $oft
Очевидно, потому что точность типа Single не настолько высока, чтобы вычислять числа с такой точностью. Также стоит помнить про машинную точность в целом.


Какая точность? Данный пример решит школьник, который знает что такое дробные числа...
Честно говоря, я удивлен такой проблеме в таком языка как с#?
Например: MessageBox.Show((3578.27-3577.20).ToString()) выдает такой результат 1,07000000000016.
Ну это ваще...
Где об этом можно почитать?

326
18 мая 2014 года
sadovoya
757 / / 19.11.2005
Это общая для всех языков проблема. В форуме уже обсуждали схожий вопрос. Если коротко, то дробь конечная в десятичном представлении далеко не всегда конечна в двоичном. Либо может требовать для точного представления большего числа разрядов, чем отводится машиной. Т.е. будет усечение ее даже на этапе просто двоичного представления (при арифметике ситуация усложнится еще). Например, точное десятичное число 0,1 априори не точное внутри двоичного компьютера, т.к. точное представление потребовало бы бесконечного числа двоичных разрядов. См. также вопросы одинарной/двойной точности и машинного эпсилон хотя бы в википедии.
326
19 мая 2014 года
sadovoya
757 / / 19.11.2005
Хороший обзор об арифметике с плавающей запятой есть на хабре.
3.0K
19 мая 2014 года
ka1n
10 / / 02.09.2004
Спасибо за ссылку на статью. Для меня это стало откровением!!!
Много лет пишу для себя всякие программки. С таким сталкиваюсь впервые... !!!
С с# столкнулся относительно недавно... До этого больше работал в Delphi.
Но там я таких проблем не наблюдал.
Функция delphi ShowMessage(FloatToStr(4434.56-4431.26) ) выдает правильный результат: 3,3 (на c#, как мы помним, 3,300293)
P. S. :
В школе для умственно отсталых детей:
— Машенька,сколько будет 2Х2?
— Пять тыщ!
— Неправильно,а Петенька что скажет?
— Вторник!
— Неправильно,а Вовочка?
— Четыре..
— Правильно,а как ты это посчитал?
— Это ж элементарно,- пять тыщ минус вторник.
326
19 мая 2014 года
sadovoya
757 / / 19.11.2005
На Дельфи аналог выглядит так:

 
Код:
...
var
 d1,d2,d : single;
...
d1:= 4434.56;
d2:= 4431.26;
d:= d1 - d2;
ShowMessage( FloatToStrF(d,ffGeneral,7,7) ) ; //урезаем тоже до сингла в отображении
Дельфистам можно прочесть еще это
465
19 мая 2014 года
QWERYTY
595 / / 25.03.2012
То же самое хотел написать, обновил страницу и уже всё есть)))

Изначально не корректно было сравнивать точность Single и Extended. Это плохая чистота эксперимента.
Вы же должны были видеть что функция FloatToStr в качестве аргумента принимает Extended.
В вашем примере на Delphi тип не указан явно, а следовательно числа высчитываются с точностью Extended.
326
19 мая 2014 года
sadovoya
757 / / 19.11.2005
Ну, а второй пример еще более наглядно в Дельфи переписывается:

 
Код:
...
var
 f1,f2,f : double;
...
f1:= 3578.27;
f2:= 3577.20;
f:= f1-f2;
ShowMessage(FloatToStr(f));
С Extended было бы все кругленько :)
3.0K
20 мая 2014 года
ka1n
10 / / 02.09.2004
Так, я понял...
Что делать?
Чем мне пользоваться в C#, чтобы обеспечить такую же точность как для extended в Delphi???
В MSDN в таблице с типами с плавающей запятой только два типа: float и double. http://msdn.microsoft.com/ru-ru/library/9ahet949%28v=vs.100%29.aspx
3.0K
20 мая 2014 года
ka1n
10 / / 02.09.2004
Спасибо всем кто меня просвещал. На самом деле мне в задаче, которая стоит передо мной, нужна только целая часть числа :)
Теперь я буду более осторожен в решении математических задач.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог