Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Округление вещественных чисел


Автор: Rodeon 9.8.2018, 20:42
Имеем:
база данных: FireByrd 2.5
тип данных: DECIMAL(14,3) NOT NULL
данные как пример: 96.600

среда: Delphi Rad Studio 10.2
тип переменной: пробовал и Single и Double
присваиваю:
Sostav_gas.C3H8:=MainForm.FDQuery.Fields.Fields[4].AsSingle;

на выходе получаю: 96.5999984741211

Если присваиваю так:
Sostav_gas.CH4:=SimpleRoundTo(MainForm.FDQuery.Fields.Fields[2].AsSingle,-3);
то на выходе снова 96.5999984741211

Если присваиваю так:
Sostav_gas.CH4:=StrToFloat(FormatFloat('0.000',MainForm.FDQuery.Fields.Fields[2].AsSingle));
то на выходе нормальные: 96.6

я понимаю про округление вещественных типов, но блин конвертировать в текст и обратно - "костыли".
Подскажите более простой способ. Спасибо.


Автор: Snowy 10.8.2018, 00:33
Варианты:
1. Используй numeric
2. Используй Round(x*1000)/1000
3. Не используй decimal - используй целые числа, умноженные на 1000 (замени единицы измерения на миллиграммы, и их уже конвертируй в граммы). Тебе точка нужна только для отображения. Считать можно в других единицах.
4. Смени FireBird на другую базу и там используй нормальный здоровый numeric некурильщика, который не пытается быть вещественным.

Автор: Rodeon 10.8.2018, 00:50
Вобщем вышел из пложения, перепробовал разные комбинации.
Переменная Double
присваиваю так:
Sostav_gas.CH4:=MainForm.FDQuery.FieldByName('CH4').AsExtended;
правда помогает только до 4-х знаков, 5 знаков уже опять начинается фигня.
Но меня это устраивает.

Добавлено через 2 минуты и 31 секунду
Но за совет спасибо, буду иметь ввиду. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)