Округление чисел в Финансах без проблем.



Posted by Анатолий Анимица on February 03, 2000 at 09:32:52:

In Reply to: Раз пошла такая пьянка ... posted by Владимир Секретев, Клуб Любителей Бухгалтерского Учета on February 03, 2000 at 04:14:20:

Володя Секретев совершенно резонно заметил о преимуществе использования функции [tr] при округлении вместо [ro] - из-за того, что [ro 0.5]=0 в Ultra-16.
Только не надо забывать, что целое приближение x0 положительного числа x = [tr x+0.5],а отрицательного числа : x0=[tr x-0.5]. В предыдущем примере я специально написал [ro], чтобы не утомлять читателя лишними подробностями, тем более, при округлении ДРОБНОЙ части числа до заданной точности. Чтобы раз и навсегда покончить с этими проблемами, можно использовать следующую подпрограмму:


:ro подпрограмма округления вход x выход x точность n знаков после запятой
if ~(n in -3..5)
error подпрограмма ro округляет в диапазоне -3..5 знаков после запятой
endif
n=[ro n] округлим показатель на всякий случай
yx=x;if yx<0 yx=-yx;endif округляем положительные числа
k=1
if n<0 нормализация до -n нулей в конце числа
for m=n to -1 в цикле
yx=yx/10;k=k*10 число делим на 10, показатель умножаем на 10
endfor
*yxдо ^^^^^^^^yx^^^^^^^^^^
yx=[tr yx+0.5]*k округляем
*yxпосле ^^^^^^^^yx^^^^^^^^^^
elseif n=0 если требуется просто целое число
*yxdo ^^^^^^^^^yx^^^^
yx=[tr yx+0.500001] просто округляем (+0.5+1Е-6)
* ЕСЛИ НАПИСАТЬ +0.5 - ПОСМОТРИТЕ, ЧТО БУДЕТ!!
*yxpo ^^^^^^^^^yx^^^^
elseif n>0 если требуется число с n знаков после запятой
for m=1 to n в цикле
yx=yx*10;k=k/10 число умножаем на 10, показатель делим на 10
endfor
*yxдо- ^^^^^^^^^yx^^^^^^^^^^
yx=[tr yx+0.5]*k округляем
*yxпосле- ^^^^^^^yx^^^^^^^^^^
endif
if x>=0 x=yx восстанавливаем знак
else x=-yx
endif
return

Эту подпрограмму можно записать в first.rpt и использовать в формах, а лучше просто присоединять ее к каждой отдельной программке (само собой, для фала-коэффициента это единственный выход) путем copy+paste через clipboard.
И еще. [tr x+0.5] ТОЖЕ имеет ограниченную точность! Около 1E-16 или чуть лучше или хуже - надо всегда иметь в виду, что двоичное дробное число ВСЕГДА, кроме легко понимаемых значений, является приближением исходного десятичного числа.

ААА


Пpишедшие ответы: