在Postscript中如何将数字字符串向上舍入到2位小数

时间:2016-10-06 16:33:20

标签: postscript

我已经在postscript中提出了一个方法,它采用了一个decimel数字并返回一个2位十进制数字,将根据需要进行舍入。

该方法有一个错误,它会将小数点后的值向上舍入 但是没有数字编号的inter部分。 例如,如果数字是4.895,则该方法将正确返回4.90 但如果数字是4.995,该方法将错误返回4.00, 我无法弄清楚如何修改方法。

以下是相关方法。

formatNumerString是主要方法(%是评论的任何内容)      这有另一种方法tmpnum(将字符串转换为数字) 还有另一种方法intNum(获取数字的intiger部分) 还有另一种方法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

} bind def

任何人都可以帮我纠正上述方法。 亲切的问候

1 个答案:

答案 0 :(得分:2)

错误在于它过于复杂。

/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周围的部分。