Dozent Опубликовано 17 октября, 2014 Поделиться Опубликовано 17 октября, 2014 Какая-то ерунда в этом компоненте Что за значение такое интересное? Цитата Ссылка на комментарий
0 estra Опубликовано 17 октября, 2014 Поделиться Опубликовано 17 октября, 2014 Обычное вещественное число. Что собственно не устраивает? Цитата Ссылка на комментарий
0 Dozent Опубликовано 17 октября, 2014 Автор Поделиться Опубликовано 17 октября, 2014 ну так и должно быть? В райнтайме отображается 0,3! Мне его обрезать нужно? Цитата Ссылка на комментарий
0 estra Опубликовано 17 октября, 2014 Поделиться Опубликовано 17 октября, 2014 так и должно быть. Обрезать? смотря для чего. Для представления в виде строки может и нужно будет. Вот код, поэкспериментируйте с 2 последними цифрами: var a: Double = 0.300000011920929; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage( FloatToStrF( a, TFloatFormat.ffFixed, 4, 2 ) ); end; > В райнтайме отображается 0,3! Посмотрите какое значение указано в параметре DecimalDigits Brovin Yaroslav и Dozent 2 Цитата Ссылка на комментарий
0 Dozent Опубликовано 17 октября, 2014 Автор Поделиться Опубликовано 17 октября, 2014 Спасибо Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 17 октября, 2014 Администраторы Поделиться Опубликовано 17 октября, 2014 Полезная информация о представлении вещественных чисел в компьютере, объясняющая почему нельзя получить значение 0,3 в машинном представлении: Машинный ноль Цитата Ссылка на комментарий
0 brunnengi Опубликовано 20 октября, 2014 Поделиться Опубликовано 20 октября, 2014 Вообще я тоже с этим столкнулся, правда во время анимации. И из-за "длинного хвоста" анимация срабатывала не всегда. Не сразу понял почему. Анимация делалась для Андроид приложения. Нажимая на Recntangle он увеличивался в высоту с плавной анимацией, а при повторном нажатии возвращался в исходное состояние. Так вот в коде на нажатие шло сравнение в духе if Heigh = 80 then AnimationFloat('Heigh', 150); if Heigh = 150 then AnimationFloat('Heigh', 80); Ну и как следствие оказалось что не всегда 80, это именно 80, бывает и 80,000139 и т.к. разные вариации были. Пришлось код усложнить малость. Так что о таких вещах надо помнить. Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 20 октября, 2014 Администраторы Поделиться Опубликовано 20 октября, 2014 Это основы языка и основы работы с вещественными числами. Для таких сравнений нужно использовать функции из System.Math.SameValue Цитата Ссылка на комментарий
0 AngryOwl Опубликовано 20 октября, 2014 Поделиться Опубликовано 20 октября, 2014 (изменено) Я абсолютно согласен с Ярославом на счет "основы работы с вещественными числами", просто хочу добавить, что тоже сталкивался с такими ситуациями, но не считаю их за проблему и решал простыми условиями типа if Trunc(Height) = 80 then AnimationFloat('Height', 150); if Trunc(Height) = 150 then AnimationFloat('Height', 80); Только вот писать их друг за другом не рекомендую. Условие нужно изменить на типа: if Trunc(Height) = 80 then AnimationFloat('Height', 150) else if Trunc(Height) = 150 then AnimationFloat('Height', 80); так как в Вашем случае может возникнуть ситуация, когда высота элемента может измениться уже до проверки второго условия (хотя на практике это случается очень редко). Либо тогда "дождаться" изменения высоты и написать так: if Trunc(Height) = 80 then AnimationFloatWait('Height', 150); if Trunc(Height) = 150 then AnimationFloat('Height', 80); Изменено 20 октября, 2014 пользователем AlexG Цитата Ссылка на комментарий
0 estra Опубликовано 20 октября, 2014 Поделиться Опубликовано 20 октября, 2014 Height if Height = 80 then AnimationFloat('Height', 150); if Height = 150 then AnimationFloat('Height', 80); if Trunc(Height) = 80 then AnimationFloat('Height', 150); if Trunc(Height) = 150 then AnimationFloat('Height', 80); if Trunc(Height) = 80 then AnimationFloat('Height', 150) else if Trunc(Height) = 150 then AnimationFloat('Height', 80); if Trunc(Height) = 80 then AnimationFloatWait('Height', 150); if Trunc(Height) = 150 then AnimationFloat('Height', 80); Цитата Ссылка на комментарий
0 AngryOwl Опубликовано 20 октября, 2014 Поделиться Опубликовано 20 октября, 2014 Да, конечно. Спасибо estra! Исправил. Цитата Ссылка на комментарий
0 brunnengi Опубликовано 21 октября, 2014 Поделиться Опубликовано 21 октября, 2014 Я абсолютно согласен с Ярославом на счет "основы работы с вещественными числами", просто хочу добавить, что тоже сталкивался с такими ситуациями, но не считаю их за проблему и решал простыми условиями типа if Trunc(Height) = 80 then AnimationFloat('Height', 150); if Trunc(Height) = 150 then AnimationFloat('Height', 80); Только вот писать их друг за другом не рекомендую. Условие нужно изменить на типа: if Trunc(Height) = 80 then AnimationFloat('Height', 150) else if Trunc(Height) = 150 then AnimationFloat('Height', 80); так как в Вашем случае может возникнуть ситуация, когда высота элемента может измениться уже до проверки второго условия (хотя на практике это случается очень редко). Либо тогда "дождаться" изменения высоты и написать так: if Trunc(Height) = 80 then AnimationFloatWait('Height', 150); if Trunc(Height) = 150 then AnimationFloat('Height', 80); Спасибо, но как я уже писал, что код я уже сделал путем его усложнения. И конечно же почти таким же методом. Вообще на Andoid (именно для него я делал эту анимацию и на Win не проверял), возникала проблема другого рода, иногда (редко), анимация приводила не к точным значениям (150 и 80), будь то просто AnimationFloat или AnimationFloatWait. И по итогу значение не было 150, и даже не было 150.000000147 или типа того, бывало и вот так - 149,999989..... Для решения пришлось использовать только AnimationFloatWait, и сразу следом за ним делать Height := 150.00; Итогом всего этого стало самовольное решение уйти от такого подхода в программе в целом, ибо если уже все не так изящно, как хотелось бы, то значит надо пересилить себя и искать иной поход. Ну и кстати по другому оказалось куда удобнее и быстрее. Цитата Ссылка на комментарий
Вопрос
Dozent
Какая-то ерунда в этом компоненте
Что за значение такое интересное?
Ссылка на комментарий
11 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.