在 Postscript 中如何将数字字符串四舍五入到小数点后两位

in Postscript how to round up a numeric string to 2 decimal places

我在后记中继承了一个方法,它接受一个小数,return一个 2 位小数,将根据需要四舍五入。

该方法有一个错误,它会将小数点后的值四舍五入 但不增加数字的中间部分。 例如,如果数字是 4.895,该方法将正确 return 4.90 但如果数字是 4.995,该方法将出错 return 4.00, 我不知道如何修改方法。

下面是有问题的方法。

formatNumerString 是主要方法(任何带 % 的都是注释) 这有另一种方法 tmpnum (将字符串转换为数字) 还有另一种方法 intNum (获取数字的整数部分) 还有一个方法decNum(获取数字的小数部分)

/formatNumberString {   % stack: number as a string
    /tmpNum exch def    % 1234567.8901
    /intNum tmpNum cvr floor cvi def    % 1234567 (int)
    /decNum tmpNum cvr intNum sub 100 mul round cvi def % 0.8901 changing to 89 (int)

/units intNum 1000 mod def
/remaining intNum units sub 1000 div cvi def
remaining 0 eq {
    /formatNumStr units numToStr def
} {
    /formatNumStr units threeDigitStr def
} ifelse
{
    remaining 0 eq {
        exit
    } if
    /units remaining 1000 mod def
    /remaining remaining units sub 1000 div cvi def
    remaining 0 eq {
        /formatNumStr units numToStr (,) mergeStrings formatNumStr mergeStrings def
    } {
        /formatNumStr units threeDigitStr (,) mergeStrings formatNumStr mergeStrings def
    } ifelse
} loop
%formatNumStr (.) mergeStrings decNum threeDigitStr mergeStrings
formatNumStr (.) mergeStrings decNum 2 digitStr mergeStrings

} 绑定定义

谁能帮我改一下上面的方法。 亲切的问候

错误是太复杂了

/formatNumberString {   % stack: number as a string
    cvr                 % 1234567.8901
    100 mul             % get the relevant positions before the decimal point
    .5 add              % you wanted to round up always? 123456789.51 (else remove this line)
    round cvi           % 123456790
    100 div             % 1234567.9
    .001 add            % so we always have two digits after, the 1 will be cut off
    100 string cvs     % (1234567.901)
    0 1 index length 1 sub % (1234567.901) 0 (length-1) cut off the last appended 1
    getinterval         % (1234567.90)
} def

100 string 周围的部分可以优化。