Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
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"): Скрипт выполнен успешно.


Это нормальное поведение?
Аватара пользователя
Алексей Пикуров
Что именно вас не устраивает, уточните конкретнее.
Аватара пользователя
Алексей Пикуров
Дошло :) Посмотрим, отвечу чуть позже.
Аватара пользователя
ChimMAG
В принципе я разобрался в чём дело: результат 10/100 приводится к целому виду, так как оба числа целые. То есть неявное преобразование типов даёт... неожиданный результат... И всё же мне кажется, что это не совсем правильная внутренняя логика. То есть 100/10=10 - и результату лучше быть целым. Но 10/4=2.5, а не 2. В конце концов уж лучше пусть деление всегда будет числом с плавающей запятой, чем таким, так как для округления или выделения целой части есть специализированные команды и при необходимости это легко реализуется. Как считаете?
Аватара пользователя
Алексей Пикуров
На самом деле косяк в скриптовом движке. Надо заменить функции StrToFloat и FloatToStr, они иногда некорректно отрабатывают при определённом сочетании системных локалей. Спасибо, что заметили.
Аватара пользователя
Алексей Пикуров
+ есть нюанс с дробными числами.

Явно укажите, что все числа с плавающей точкой и тогда будет всё Ок.

Код: Выделить всё
begin
    mLogScript(FloatToStr(10.0/4.0),'');
    mLogScript(FloatToStr(10.0/9.9),'');
    mLogScript(FloatToStr(10.0/100.0),'');
    mLogScript(FloatToStr(0.1234),'');
end.


Переношу тему в раздел скриптов.
Аватара пользователя
ChimMAG
Ну это когда явные числа. С переменными так не подойдёт. Но я нашёл выход из ситуации - можно прибавить очень маленькое число или умножить на что-то близкое к 1. Наверное прокатит даже умножение на 1.0?
Аватара пользователя
Алексей Пикуров
С переменными так не подойдёт

Почему это? Покажите код, который у вас не работает, как ожидалось.
Аватара пользователя
Алексей Пикуров
Пример:

Код: Выделить всё
var
  d1, d2: integer;
begin
  d1 := 10;
  d2 := 17;
  mLogScript(FloatToStr(d1/extended(d2)), '');
end.   
Аватара пользователя
ChimMAG
О, не знал, что так можно. Так и сделаю. Спасибо.