Страница 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
О, не знал, что так можно. Так и сделаю. Спасибо.