Это проблема точности с плавающей запятой. При тестировании значений с плавающей запятой на равенство SAS использует значение «fuzz» 1e-12 (по умолчанию). Выражение a = b оценивается как истинное, если abs (a-b) <1e-12. В вашем случае, 1.85e-13 достаточно близко к нулю, чтобы SAS дал ему формат «отрицательный» (почему он всегда присваивает это, а никогда «ноль», я не знаю). </p>
Один из способов справиться с этим - уменьшить значение fuzz, которое SAS ассоциирует с вашим форматом:
proc format;
value testf (fuzz=1E-13) -1.85E-13--1.85E-13 = 'negative' 0-0 = 'zero';
run;
Этот формат присваивает ожидаемому varlabel 'ноль'.
Если подобные вещи являются практической проблемой для вас, вы, возможно, захотите тщательно подумать о потенциальных проблемах числовой точности в вашем коде, так как они способны генерировать некоторые неприятные и трудно обнаруживаемые ошибки в неправильных условиях .
Эта ссылка дает некоторую информацию о проблемах числового представления в SAS, которая может оказаться полезной.