Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

Вещественные числа и округление   Найти похожие ветки 

 
Juice ©   (2007-01-26 13:36) [0]

Помогите пожалуйста понять следующую проблему. В ячейку грида вносим число - 1.005. В AfterPost нужно округлять вносимую в эту колонку величину до копеек методом арифметического округления и присвоить результат переменной.

Округление на 1,005 постоянно выдавало 1 (пробовал как на стандартной SimpleRoundTo так и на сторонней DecimalRoundExt). Провел єксперимент:


 x, y : Extended;
begin
x := DataSet.FieldByName("PriceEval").Value;
 y := DataSet.FieldByName("PriceEval").AsFloat;
 if (DataSet.FieldByName("PriceEval").Value) < 1.005 then ShowMessage("Value<1.005");
 if (DataSet.FieldByName("PriceEval").Value) > 1.005 then ShowMessage("Value>1.005");
 if (DataSet.FieldByName("PriceEval").Value) = 1.005 then ShowMessage("Value=1.005");

 if (DataSet.FieldByName("PriceEval").AsFloat) < 1.005 then ShowMessage("AsFloat<1.005");
 if (DataSet.FieldByName("PriceEval").AsFloat) > 1.005 then ShowMessage("AsFloat>1.005");
 if (DataSet.FieldByName("PriceEval").AsFloat) = 1.005 then ShowMessage("AsFloat=1.005");

 if x < 1.005 then ShowMessage("x<1.005");
 if x > 1.005 then ShowMessage("x>1.005");
 if x = 1.005 then ShowMessage("x=1.005");

 if y < 1.005 then ShowMessage("y<1.005");
 if y > 1.005 then ShowMessage("y>1.005");
 if y = 1.005 then ShowMessage("y=1.005");


Результат :

Value=1.005
АsFloat<1.005
x<1.005
y<1.005


Вопрос: почему "Value =" а "AsFloat<" ???

И еще :
z := DataSet.FieldByName("PriceEval").Value;
x < 1.005 = true
т.е. в результате даже присвоения переменной меняется значение, но почему? Ведь z по типу extended, самый широкий ?


 
Desdechado ©   (2007-01-26 14:00) [1]

Потому как число с ПЛАВАЮЩЕЙ точкой. Это особенности его хранения. Хочешь точности, используй с ФИКСИРОВАННОЙ точкой.


 
Juice ©   (2007-01-26 14:05) [2]


> Потому как число с ПЛАВАЮЩЕЙ точкой. Это особенности его
> хранения. Хочешь точности, используй с ФИКСИРОВАННОЙ точкой.
>

Это понятно, меня эта особенность и интересовала.
А как решить простую практическую задачу - правильно округлить float-значение до копеек ?


 
icWasya ©   (2007-01-26 14:07) [3]

Прочти и раскрась
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217


 
Juice ©   (2007-01-26 14:17) [4]


> Прочти и раскрась
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217

Спасибо, но читал уже и не раз, то что стандартные лагают знаю из собственного опыта. Но вот проблема, повторюсь, как правильно округлить float-значение ? Рекомендуемая автором той статьи DecimalRoundExt(n, 2, drHalfUp) by John Herbster тоже дает 1. ???


 
Desdechado ©   (2007-01-26 15:28) [5]

> А как решить простую практическую задачу - правильно округлить float-значение до копеек ?
Float - это число, а не деньги. В нем нет копеек.
Еще раз: используй фиксированный формат, а не пытайся заниматься проктологией.


 
Vlad Oshin ©   (2007-01-26 16:02) [6]

странно, и в примере вот тоже написано
RoundTo(1.235, -2) 1.24

и так и есть.
А
RoundTo(1.005, -2) 1

правда, можно решить используя бесконечно малую :)
RoundTo(1.0050000000000001, -2) 1

SetRoundMode или тут поковырять, может и есть что


 
Juice ©   (2007-01-26 18:16) [7]


> Float - это число, а не деньги. В нем нет копеек.
> Еще раз: используй фиксированный формат, а не пытайся заниматься
> проктологией.

Я согласен на все сто, я и сам в финансовых вычислениях currency использую. Просто для себя хотелось разобраться, причину такого поведения я для себя уяснил, число не выражается конечной двоичной дробью и отсюда все проблемы. Интересно таки как же округлять числа с плавающей точкой ? Вот FloatToStr к примеру все правильно показывает, значит умеет правильно округлять.


> странно, и в примере вот тоже написано
> RoundTo(1.235, -2) 1.24
>
> и так и есть.
> А
> RoundTo(1.005, -2) 1

Это банковское округление



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.035 c
8-1150388501
***(H@kker)***
2006-06-15 20:21
2007.02.11
Экспорт модели


15-1169438560
Slider007
2007-01-22 07:02
2007.02.11
С днем рождения ! 22 января


6-1157547727
провидец
2006-09-06 17:02
2007.02.11
TWebBrowser


2-1169405647
Decoy
2007-01-21 21:54
2007.02.11
Помогите написать клиент


1-1166031886
transp
2006-12-13 20:44
2007.02.11
Панель без "отрисовки"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский