Неожиданный результат при мат. действиях с преобразованным форматом
Код:
textBox15.Text += (Single.Parse("4434,56") - Single.Parse("4431,26")).ToString()
А не 3,3
- Прочитал тему как "Неожиданный мат при действиях с преобразованным форматом" :-) от Freeman, 16 мая 2014 года
http://msdn.microsoft.com/ru-ru/library/364x0z75(v=vs.100).aspx
Если нужна идеальная точность - оперируй с правильными дробями :)
А вообще, поиск - это круто.
Если нужна идеальная точность - оперируй с правильными дробями :)
А вообще, поиск - это круто.
Очевидно, потому что точность типа Single не настолько высока, чтобы вычислять числа с такой точностью. Также стоит помнить про машинную точность в целом.
Цитата: @pixo $oft
Очевидно, потому что точность типа Single не настолько высока, чтобы вычислять числа с такой точностью. Также стоит помнить про машинную точность в целом.
Какая точность? Данный пример решит школьник, который знает что такое дробные числа...
Честно говоря, я удивлен такой проблеме в таком языка как с#?
Например: MessageBox.Show((3578.27-3577.20).ToString()) выдает такой результат 1,07000000000016.
Ну это ваще...
Где об этом можно почитать?
схожий вопрос. Если коротко, то дробь конечная в десятичном представлении далеко не всегда конечна в двоичном. Либо может требовать для точного представления большего числа разрядов, чем отводится машиной. Т.е. будет усечение ее даже на этапе просто двоичного представления (при арифметике ситуация усложнится еще). Например, точное десятичное число 0,1 априори не точное внутри двоичного компьютера, т.к. точное представление потребовало бы бесконечного числа двоичных разрядов. См. также вопросы одинарной/двойной точности и машинного эпсилон хотя бы в википедии.
Это общая для всех языков проблема. В форуме уже обсуждали
Хороший обзор об арифметике с плавающей запятой есть на
Много лет пишу для себя всякие программки. С таким сталкиваюсь впервые... !!!
С с# столкнулся относительно недавно... До этого больше работал в Delphi.
Но там я таких проблем не наблюдал.
Функция delphi ShowMessage(FloatToStr(4434.56-4431.26) ) выдает правильный результат: 3,3 (на c#, как мы помним, 3,300293)
P. S. :
В школе для умственно отсталых детей:
— Машенька,сколько будет 2Х2?
— Пять тыщ!
— Неправильно,а Петенька что скажет?
— Вторник!
— Неправильно,а Вовочка?
— Четыре..
— Правильно,а как ты это посчитал?
— Это ж элементарно,- пять тыщ минус вторник.
Код:
...
var
d1,d2,d : single;
...
d1:= 4434.56;
d2:= 4431.26;
d:= d1 - d2;
ShowMessage( FloatToStrF(d,ffGeneral,7,7) ) ; //урезаем тоже до сингла в отображении
var
d1,d2,d : single;
...
d1:= 4434.56;
d2:= 4431.26;
d:= d1 - d2;
ShowMessage( FloatToStrF(d,ffGeneral,7,7) ) ; //урезаем тоже до сингла в отображении
Изначально не корректно было сравнивать точность Single и Extended. Это плохая чистота эксперимента.
Вы же должны были видеть что функция FloatToStr в качестве аргумента принимает Extended.
В вашем примере на Delphi тип не указан явно, а следовательно числа высчитываются с точностью Extended.
Код:
...
var
f1,f2,f : double;
...
f1:= 3578.27;
f2:= 3577.20;
f:= f1-f2;
ShowMessage(FloatToStr(f));
var
f1,f2,f : double;
...
f1:= 3578.27;
f2:= 3577.20;
f:= f1-f2;
ShowMessage(FloatToStr(f));
Что делать?
Чем мне пользоваться в C#, чтобы обеспечить такую же точность как для extended в Delphi???
В MSDN в таблице с типами с плавающей запятой только два типа: float и double. http://msdn.microsoft.com/ru-ru/library/9ahet949%28v=vs.100%29.aspx
Теперь я буду более осторожен в решении математических задач.