我已经在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
任何人都可以帮我纠正上述方法。 亲切的问候
答案 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
周围的部分。