После деления 30 на 1,2 получается целое число 25. Также как если 300 поделить на 1,2 получается 250, а не 249 как в макросе.
После деления 30 на 1,2 получается целое число 25. Также как если 300 поделить на 1,2 получается 250, а не 249 как в макросе.
Так получится, но какие значения будут на выходе при изменениях переменной на входе?
Да и преобразовать вещественное 250 в целое и получить 249 на выходе это нелогично - вот в чем вопрос.
25/1,2=20,8 должно быть 20, а с +0,5 получится 21
А в железе такой-же результат?
Последовал Вашему совету, прибавил 0,001
я не советовал прибавлять 0.001
я предлагаю один из вариантов округления называющийся Округление до указанного кратного (https://alphapedia.ru/w/Rounding 3.1 Округление до указанного кратного)
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Судя по всему, результат деления имеет вид 24.999999, хотя и отображается в отладке как 25. Ну а блок преобразования к udint не округляет, а просто отбрасывает дробную часть.
Где-то на форуме выкладывали макрос округления к ближайшему целому, похоже нужно в таких случаях перед блоком преобразования использовать что-то подобное.
Округление с нужным количеством знаков:
Код:function fRound : real; var_input rIn : real; N : udint; end_var var tmp : udint; end_var tmp := 10; if N.0 then fRound := udint_to_real(tmp); else fRound := 1; end_if; N := SHR(N,1); while N > 0 do tmp := tmp * tmp; if N.0 then fRound := fRound * udint_to_real(tmp); end_if; N := SHR(N,1); end_while; rIn := rIn * fRound; fRound := (( rIn / abs(rIn) ) * udint_to_real(real_to_udint((abs(rIn) + 0.5)))) / fRound; end_function
Последний раз редактировалось 1exan; 10.08.2022 в 06:55.
Ага, забил на вход 0.71 и получил на выходе 0.8. Офигенно просто))). 1 CDS2_3.jpg
Var1:=real_to_udint(rin * 10)/10.0 ; куда проще написать
Последний раз редактировалось kondor3000; 10.08.2022 в 09:25.
Проверил - у меня все правильно:
изображение_2022-08-10_131413706.png
А что дает "Var1:=real_to_udint(rin * 10)/10.0 ?