Страница 1 из 1
Тип Extended/Float при работе с делением чисел в скриптах, функция FloatToStr

Добавлено:
Чт янв 20, 2022 4:24 pm
ChimMAG
Код: Выделить всёbegin
mLogScript(FloatToStr(10/4),'');
mLogScript(FloatToStr(10/9.9),'');
mLogScript(FloatToStr(10/100),'');
mLogScript(FloatToStr(0.1234),'');
end.
В итоге получаем:
Код: Выделить всё[17:17:00] (Log "Temp"): 2.000000000000
[17:17:00] (Log "Temp"): 1.010101010101
[17:17:00] (Log "Temp"): 0.000000000000
[17:17:00] (Log "Temp"): 0.123400000000
[17:17:00] (Run "Temp"): Время выполнения скрипта: 5 мс
[17:17:00] (Run "Temp"): Скрипт выполнен успешно.
Это нормальное поведение?
Re: Тип Extended/Float

Добавлено:
Чт янв 20, 2022 4:27 pm
Алексей Пикуров
Что именно вас не устраивает, уточните конкретнее.
Re: Тип Extended/Float

Добавлено:
Чт янв 20, 2022 4:29 pm
Алексей Пикуров
Дошло

Посмотрим, отвечу чуть позже.
Re: Тип Extended/Float

Добавлено:
Чт янв 20, 2022 4:31 pm
ChimMAG
В принципе я разобрался в чём дело: результат 10/100 приводится к целому виду, так как оба числа целые. То есть неявное преобразование типов даёт... неожиданный результат... И всё же мне кажется, что это не совсем правильная внутренняя логика. То есть 100/10=10 - и результату лучше быть целым. Но 10/4=2.5, а не 2. В конце концов уж лучше пусть деление всегда будет числом с плавающей запятой, чем таким, так как для округления или выделения целой части есть специализированные команды и при необходимости это легко реализуется. Как считаете?
Re: Тип Extended/Float

Добавлено:
Чт янв 20, 2022 4:44 pm
Алексей Пикуров
На самом деле косяк в скриптовом движке. Надо заменить функции StrToFloat и FloatToStr, они иногда некорректно отрабатывают при определённом сочетании системных локалей. Спасибо, что заметили.
Re: Тип Extended/Float

Добавлено:
Чт янв 20, 2022 5:09 pm
Алексей Пикуров
+ есть нюанс с дробными числами.
Явно укажите, что все числа с плавающей точкой и тогда будет всё Ок.
Код: Выделить всёbegin
mLogScript(FloatToStr(10.0/4.0),'');
mLogScript(FloatToStr(10.0/9.9),'');
mLogScript(FloatToStr(10.0/100.0),'');
mLogScript(FloatToStr(0.1234),'');
end.
Переношу тему в раздел скриптов.
Re: Тип Extended/Float при работе с делением чисел в скриптах, функция FloatToStr

Добавлено:
Чт янв 20, 2022 5:37 pm
ChimMAG
Ну это когда явные числа. С переменными так не подойдёт. Но я нашёл выход из ситуации - можно прибавить очень маленькое число или умножить на что-то близкое к 1. Наверное прокатит даже умножение на 1.0?
Re: Тип Extended/Float при работе с делением чисел в скриптах, функция FloatToStr

Добавлено:
Чт янв 20, 2022 5:41 pm
Алексей Пикуров
С переменными так не подойдёт
Почему это? Покажите код, который у вас не работает, как ожидалось.
Re: Тип Extended/Float при работе с делением чисел в скриптах, функция FloatToStr

Добавлено:
Чт янв 20, 2022 5:59 pm
Алексей Пикуров
Пример:
Код: Выделить всёvar
d1, d2: integer;
begin
d1 := 10;
d2 := 17;
mLogScript(FloatToStr(d1/extended(d2)), '');
end.
Re: Тип Extended/Float при работе с делением чисел в скриптах, функция FloatToStr

Добавлено:
Чт янв 20, 2022 10:17 pm
ChimMAG
О, не знал, что так можно. Так и сделаю. Спасибо.