TCL плавающий вывод expr используется с условным оператором '<' не работает

Я использую TCL 8.4, хотя следующее работает, как ожидалось,

% if { 50.02 < 50.02 } { puts HI }
% set s 50.02
50.02
% if { $s <  50.02 } { puts HI }
% set high 50.02
50.02
% if { $s <  $high } { puts HI }
%
%
% if { 50.02 < $high } { puts HI }

Почему это следующее не работает? Я действительно не могу понять это поведение. Примечание: когда $s составляет 50,03, это работает как ожидалось.

% set s [ expr 50.01 + 0.01 ]
50.02
% if { $s <  $high } { puts HI }
HI
% set s [ expr double(50.01 + 0.01) ]
50.02
% if { $s <  $high } { puts HI }
HI

1 ответ

Числа с плавающей точкой не могут быть сохранены точно. Для двух чисел, которые математически должны быть равны, результат сравнения может быть неверным.

Мой Tcl 8.6 печатает (и это может объяснить результат, который вы получаете):

% set s [ expr 50.01 + 0.01 ]
50.019999999999996

Более подробную информацию об этом можно получить на wiki.tcl.tk: настоящая проблема

Другие вопросы по тегам