在 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
周围的部分可以优化。
我在后记中继承了一个方法,它接受一个小数,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
周围的部分可以优化。