|
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 69
|
||||||
Конвертация во float и совместимость win 10 с win (7 и xp)31.01.2019, 09:39. Показов 2208. Ответов 25
Всем привет. Есть код написанный в борадатые года и отлично работающий на win 10.
В общем не давно заметил что на win 7 он перестал работать, хотя изначально для неё и разрабатывался.
str2 = 3023.78; Ошибка возникает только на win 7 и XP с str2. Пишет что “3023.87’ is not a valid floating point value На 10 такой ошибки нет. Системный разделитель я проверил. Стоит . Подскажите в чем может быть дело ?
0
|
||||||
| 31.01.2019, 09:39 | |
|
Ответы с готовыми решениями:
25
Совместимость Win XP и Win 2000 при взаимодействии с консолью После обновления Win 8.1 до Win 10, можно ли поставить старую Win 8.1 на другой ПК ? Конвертация кодировки DOS в Win |
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 31.01.2019, 10:21 | |
|
Скриншот окна ошибки покажите. И что это за странные кавычки в коде? Приведенный код не скомпилируется.
0
|
|
|
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 69
|
|
| 31.01.2019, 11:39 [ТС] | |
|
Ковычки такие из-за того что с телефона печатал
0
|
|
|
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
|
||||||
| 31.01.2019, 11:45 | ||||||
|
Bag_ali, в сообщении об ошибке видно, что перед цифрами в тексте стоит как минимум один пробел. Вероятно, метод Trim() не применился.
Попробуй вторым параметром в функцию передать
0
|
||||||
|
51 / 39 / 15
Регистрация: 20.09.2018
Сообщений: 163
|
|
| 31.01.2019, 12:15 | |
|
это фотка криво сделана или в сообщении об ошибке после числа стоит одинарная кавычка?
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 01.02.2019, 11:12 | |
|
Надо сначала привести оба числа к float, а только потом сравнивать. Сразу будет понятно если где всплывет ошибка (в моменте преобразования из строки).
Еще можно попробовать посчитать количество символов непосредственно перед преобразованием: если в строке "3023.78" будет более семи символов, значит худо.
0
|
|
|
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
|
||
| 01.02.2019, 16:28 | ||
|
Ибо любая стандартная библиотечная конверташка сделана под максимально возможную точность (избыточная точность результата обрезается уже операцией присваивания). Например, ANSI C/C++-конверташки из строки в плавучку atof(), strtod() возвращают дабл. Т.е. проглотят и полтора десятка значащих цифр. А StrToFloat - аж long double возвращает (т.е. 80 бит вместо 64рёх обычного дабла). Возвращающих флоаты аналогов этих функций - в базовых/стандартных библиотеках просто нет! Т.е. всякие "худо" (например, строку не из цифр и прочее) надо ловить по-иному, обработчиками исключительных ситуаций или анализом возвращённых функцией результатов.
0
|
||
|
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
|
|
| 01.02.2019, 22:40 | |
|
VTsaregorodtsev, Причём тут точность? Речь же шла о проверке того, что в функцию передаётся строка, которая помимо числа содержит ещё какой-то мусор.
А вообще, данной теме уделено уже неоправданно много внимания. Ошибка из одного ряда с пропущенной ";". При том, что ТС, вероятно, либо уже решил проблему, либо не очень-то ему это и нужно.
0
|
|
|
694 / 6951 / 265
Регистрация: 11.08.2016
Сообщений: 3,932
|
|
| 01.02.2019, 22:50 | |
|
Посмотри, какой десятичный разделитель выставлен в системе. StrToFloat по умолчанию переводит с тем, который выставлен в винде. Если в винде стоит запятая, с точкой не прокатит.
0
|
|
|
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
|
||
| 02.02.2019, 19:56 | ||
|
Где там у него было про проверку на мусор? А вот идея проверки того, что "нельзя впихнуть невпихуемое" - у него была. Но - с предлагаемым порогом (7 символов-цифр), актуальным ТОЛЬКО для флоата. Хотя все предусмотренные СТАНДАРТАМИ ЯЗЫКА и его библиотек конвертеры строки в плавучку - возвращают дабл или лонг дабл. Усечение точности - происходит уже при присваивании результата переменной в памяти. Да и sscanf/swscanf, где в строке формата можно сразу попросить сохранить именно во флоат, внутри себя тоже могут сначала конвертировать в дабл - и только потом будут пытаться упихивать результат в требуемый строкой формата флоат. И если не возникнет переполнения - всё будет ОК. Т.е. высказанное SatanaXIII требование о не более чем 7 цифрах в строке - не является обязательным для неуспеха конвертации. Что я и отметил. Причём я мог и другой, более простой пример привести. Например, спросить, отчего это должна быть неуспешной конверсия строки "0.000000000000001", если 1е-15 вполне по силам флоату?
0
|
||
|
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
|
||
| 03.02.2019, 12:05 | ||
|
О каком вообще усечении точности может идти речь при ошибке "is not a valid floating point value"? Программа не приняла строку, а до работы с числовыми форматами дело вообще не дошло.
0
|
||
|
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
|
||
| 03.02.2019, 20:00 | ||
|
Что, примера про "0.000000000000001" == 1е-15 не хватает, и мне надо напомнить, что и 10^-38, и 10^38 всё ещё влезают во флоат, не говоря уж про дабл? Почти 40 символов будет в "обычной"=неэкспоненциальной строковой записи таких чисел - и ни у кого никаких проблем. В общем, различайте символы в числе как строке - и значащие цифры в числе. И ещё. Я вот гляжу в справку по StrToFloat (раз ТС её юзает - будем в этих рамках держаться) - и вижу, что там чёрным по белому написано про Leading and trailing blanks are ignored. Т.е. пробелы по обе стороны от числа - допустимы, и сами по себе успешность конвертации такие пробелы не влияют. Поэтому умоляю - не начинайте придумывать очередную сказку, что пробелы != символы ![]() Фактически, я уже третьим способом опровергаю ересь про необходимость 7 символов - может, всё-таки признаетесь в грехах и покаетесь?
0
|
||
|
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
|
||||
| 03.02.2019, 21:47 | ||||
|
В сообщении об ошибке чёрным по серому написано: "is not a valid floating point value". Не "floating point overflow".
0
|
||||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 04.02.2019, 09:36 | |
|
VTsaregorodtsev, очень хорошо, что вы обладаете знаниями о том, какие числа влазят во флоат, а так же стремлением делиться этими знаниями. Умение читать справку так же очень полезно, но умение читать ее внимательно бывает еще полезнее - не только пробелы могут передаваться параметром в StrToFloat, но и любые другие непечатные символы. И при внешнем кажущемся сходстве строк с непечатными символами, суть их может сильно различаться, и не каждая функция - в частности StrToFloat - производит подобную полную проверку своих строковых параметров.
Когда я предлагал проверить именно длину передаваемой в функцию строки - эти пресловутые "7 символов-цифр", то смысл этого был как раз в том, чтобы выяснить не затесались ли в строку непечатные символы. Вот вы предлагаете в подобных ситуациях использовать выбрасывание исключений или анализ возвращаемых значений функции. Допустим мы выбрали ловлю исключений: оборачиваем вызов StrToFloat в try-catch блок и получаем ожидаемое EConvertError. Дальше что? Мы очень здорово и на высоком профессиональном уровне получили ровно такой же результат, как и в отладчике глазами. Но допустим мы выбрали обработку результата из функции: пишем метод, получающий строку и внутри себя вызывающий в try-catch блоке StrToFloat, и в секции catch возвращающий, например, false. Запускаем, получаем false и аплодируем себе стоя. Мы молодцы. Мораль: главное не сколько знаний и умений мы имеем, не то, как мы лихо их демонстрируем, а то, что если мы не стараемся решить проблему, а просто сотрясаем воздух, то это и есть худо.
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|||
| 04.02.2019, 13:37 | |||
|
Вот попробуйте предложите что-нибудь тс, чтобы выяснить в чем именно ошибка. И еще раз: нужно предложить тс решение или путь поиска этого решения, а не гипотезировать сидеть.
0
|
|||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 04.02.2019, 14:49 | |
|
0
|
|
|
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
|
||
| 04.02.2019, 14:58 | ||
|
У ТС в коде и OLE, и ADOQuery. Причём значение из ADOQuery извлекается как "AsFloat" и тут же передаётся в StrToFloat. Так что появление мусора не удивляет.
0
|
||
| 04.02.2019, 14:58 | |
|
Помогаю со студенческими работами здесь
20
Конвертация DBF из DOS в Win Конвертация unicode в win-1251 Python 2.7 совместимость функции с win 10 Совместимость компонентов и команд Win XP - 7. TStringGrid Совместимость hdd больше 2Tb с win 7 32bit Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|