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

Ваш аккаунт

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

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

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

FloatToStr и проблема с точностью

47K
04 мая 2011 года
Cka3o4HuK
31 / / 21.10.2009
Суть проблемы такова: есть функция, которая получает на вход double, округляет его до двух знаков после запятой и возвращает string с полученным числом. Все было замечательно 4 месяца, но буквально на днях строго в одном случае вылез косяк. Вот кусок функции:
 
Код:
function MyRoundToStr(sum:double):string;
var buf:string;
begin
  buf:=FloatToStr(sum);

на вход передается double 7225,08 а после FloatToStr в buf записывается '7225,07999999999'. Далее функция смотрит что после запятой больше двух знаков, третья цифра после запятой (9) больше 5 и добавляет к исходному числу 0,01 (sum:=sum + 0,01), в результате чего я получаю на выходе строку 7225,09. Как заставить FloatToStr преобразовать число точно =)
8
04 мая 2011 года
mfender
3.5K / / 15.06.2005
Эта функция существует в двух версиях. Вторая версия позволяет форматировать выходной поток.
416
04 мая 2011 года
MaitreDesir
380 / / 02.01.2008
 
Код:
buf:=FloatToStrF(sum,fffixed,10,2);
  buf:=floattostr(roundto(sum,-2));

И так, к сведению - если используем округление, то не забываем про <Get|Set>RoundMode
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог