最近看到很多人在做有效數(shù)字的程序粘招。SAS這樣的軟件居然沒有提供有效數(shù)字的函數(shù)啥寇,實(shí)在是有點(diǎn)不合理。那么我也跟風(fēng)寫一個(gè)有效數(shù)字的程序。
1辑甜、data aaa;
2甜橱、ornum=12936;
3、efnum=0;
4栈戳、length ornumc $200.;
5岂傲、if int(ornum)^=ornum then ornumc=put(ornum,best.-l);
6、else ornumc=cats(put(ornum,best.),'.');
7子檀、if efnum <=0 then do;put 'Error:!!!';stop;end;
8镊掖、dot=index(strip(ornumc),'.');
9、efb=prxmatch('/[1-9]/',strip(ornumc));
10褂痰、efe=efb+efnum;
11亩进、if efb < dot <= efe then efe=efe+1;
12、if efe > dot > 1? then effectnumc=putn(ornum,cats('30.',efe-dot-1,'-l'));
13缩歪、else if? dot > 1 then effectnumc=put(round(ornum,10**(dot-1-efnum)),best.-l);
14归薛、effectnum=input(effectnumc,best.);
15、run;
我們按行解釋代碼:
1匪蝙、沒啥說的主籍。
2、ornum原始數(shù)字逛球,要取近似值的那個(gè)數(shù)千元。
3、efnum是保留的位數(shù)颤绕。
4幸海、為ornumc設(shè)定長度,他是原始數(shù)值的字符型奥务。有效數(shù)字的基本思路是物独,先把數(shù)字變成字符型,然后找到要保留的那幾個(gè)數(shù)字氯葬,然后確定這幾個(gè)數(shù)字的位置挡篓,找到實(shí)際上相當(dāng)于保留多少位小數(shù)。
5-6溢谤、生成變量ornumc瞻凤,并在后面補(bǔ)上小數(shù)點(diǎn)。因?yàn)樾?shù)點(diǎn)位置是后面重要的計(jì)算依據(jù)世杀。
7阀参、這是防止輸入數(shù)據(jù)不符合要求的語句。
8-10瞻坝、變量dot是小數(shù)點(diǎn)的位置蛛壳,efb是有效數(shù)字的起始位置杏瞻,efe是有效數(shù)字的結(jié)束位置。因?yàn)楣浪阋幢A粑恢煤蟮囊晃谎眉觯Y(jié)束位置要比實(shí)際保留的位數(shù)多1捞挥,所以不需要減1。
11忧吟、要防止有效數(shù)字中間有小數(shù)點(diǎn)的情況砌函,這種情況小數(shù)點(diǎn)占一位,所以要加上1溜族,修正小數(shù)點(diǎn)的影響讹俊。
12、保留小數(shù)位要分兩種情況考慮煌抒,一種是有小數(shù)部分仍劈,一種是沒有小數(shù)部分。當(dāng)?shù)谝环N情況時(shí)寡壮,有效數(shù)字的結(jié)束位置比小數(shù)點(diǎn)位置大(小數(shù)點(diǎn)位置一定大于1)贩疙,也就是符合條件 efe > dot > 1 ,此時(shí)况既,我們把format的長度定為一個(gè)比較大的長度——30这溅,保留小數(shù)位應(yīng)該是結(jié)束位置和小數(shù)點(diǎn)位置的差。減1是因?yàn)榻Y(jié)束位置包括用來估算的最后一位坏挠。
13芍躏、第二種情況沒有小數(shù)位,此時(shí)結(jié)束位置比小數(shù)點(diǎn)薪岛荨(else if? dot > 1),此時(shí)需要計(jì)算round函數(shù)的第二個(gè)參數(shù)庇楞。先求出精確的位數(shù)(dot-1-efnum)榜配,然后把他作為10的指數(shù),就可以得到round的參數(shù)了吕晌。
14蛋褥、把數(shù)值型轉(zhuǎn)成字符型。
15睛驳、結(jié)束烙心。