var a,b,c:real;
begin
a:=4,8;
b:=4,8;
c:=a-b;
showmessage(FloatToStr(c));
end;
ответ показывает 4,44089209850063E-15
Другие языки программирования и технологии
Почему Delphi XE7 неправильно считает
Во-первых, 8/10 нельзя представить в конечном двоичном виде, так же как в десятичной системе нельзя представить в конечном виде, скажем 1/3. Поэтому в памяти хранится только некоторая часть этой дроби.
Во-вторых, операции вычитания как таковой для компьютера не существует. Для осуществления вычитания число сначала делается отрицательным, а затем осуществляется сложение. При переводе 8/10 в отрицательное его точность тоже снижается (а оно у нас и так не было точным).
Таким образом при сложении образуется разница в 1-2 бита из 64, в которых хранится число с плавающей точкой - это и есть твоя погрешность. Она неизбежна, и никакие умножения и деления (кстати, если уж на то пошло, множить надо не на степени 10-ки, а на степени 2-ки) тебя не спасут. А спасет тебя знание математики: если, блин, у тебя исходная точность данных - 1 знак после запятой, то нет никакого математического смысла в выводе данных с более чем 1 знаком после запятой. Вот и округляй до 1 знака.
Во-вторых, операции вычитания как таковой для компьютера не существует. Для осуществления вычитания число сначала делается отрицательным, а затем осуществляется сложение. При переводе 8/10 в отрицательное его точность тоже снижается (а оно у нас и так не было точным).
Таким образом при сложении образуется разница в 1-2 бита из 64, в которых хранится число с плавающей точкой - это и есть твоя погрешность. Она неизбежна, и никакие умножения и деления (кстати, если уж на то пошло, множить надо не на степени 10-ки, а на степени 2-ки) тебя не спасут. А спасет тебя знание математики: если, блин, у тебя исходная точность данных - 1 знак после запятой, то нет никакого математического смысла в выводе данных с более чем 1 знаком после запятой. Вот и округляй до 1 знака.
Это как у тебя вообще схавало? a:=4,8; ЗАПЯТАЯ вместо точки
Дима Бодров
не схавало. это я так здесь написал на скорую руку (не копировал код из delphi)
знаю только что
a:real; // a=4.8 (с точкой)
b:string; // b='4,8' (с запятой)
знаю только что
a:real; // a=4.8 (с точкой)
b:string; // b='4,8' (с запятой)
Так правильно, в чём проблема-то?
Это из-за чисел с плавающей точкой незначительная погрешность
Это из-за чисел с плавающей точкой незначительная погрешность
Дима Бодров
ответ должен быть 0
Виталий Озерной
Кстати, вот поэтому в компьютере применяются отдельно целые и вещественные типы представления чисел. И отчасти из-за этого программирование не стоит преподавать в школах - слишком много в нем тонкостей, не зная которых, можно получить ошибочные результаты.
если число 0,0000000000000000000444 тебя сильно напрягает, то выводи на экран в округленном виде. дельфи считает верно, а твои проблемы от непонимания представления числа с плавающей запятой.
Похожие вопросы
- Почему Delphi многие недолюбливают? Отличная среда, быстрый код, понятные инструкции.
- Почему Delphi 7 до сих пор так популярна?
- Почему Delphi ужасный?
- Почему Delphi хуже чем другие языки программирования?
- Паскаль, программа на определение возраста . Почему он показывает неправильно ((( ...
- ну почему PHP никто не считает адекватным йазыком программировпния?
- Семь управляющих структур. Два способа их объединения. 28 ключевых слов. Так почему же язык Си считают сложным?
- Не понимаю, почему в последних версиях Delphi (XE5, XE6, XE7) есть поддержка приложений Android?
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- Delphi:Прочитал, что если при динамическом создании компонента если указать Name объекта, то в последующем можно ->
применил
uses Math
...
c:=RoudTo(a-b,-3);
Какое бы ни было округление. если взять две ОДИНАКОВЫХ константы, при вычитании должно получаться 0
Почему в две переменные пишутся разные числа?
Я понимаю что 4.8-2.4-2.4 не факт, что получится 0, но почему 4.8-4.8 не 0?
a=4.80000019073486328125
b=4.80000019073486328125
a-b=4.80000019073486328125-4.80000019073486328125=0 !