<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Numeric division less than or greater than error in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809780#M319340</link>
    <description>&lt;P&gt;Hi, I am trying to calculate the % of A debt amount within the sum of A + B debt amount, and then I want to filter out % of A debt amount is between 90 - 100% (excluding 90% and 100%). However, in my result, it return answer where a_debt_pcent = 100.. Do you know why even though I excluded 100%?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data aa;
	input a_debt_amt b_debt_amt; 
	datalines;
	10701.54 0
	84256.96 0
	21462.54 0
	240 20
	23876.83 0
	95 5
	396 184
	982 3874
	0 9128
;
run;

data bb;
	set aa;
	a_debt_pcent = 100*a_debt_amt/(a_debt_amt+b_debt_amt);
	if 90 &amp;lt; a_debt_pcent &amp;lt; 100;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;WANT:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;b_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_pcent&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;240&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;92.307692308&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What I am getting (I don't want that, it is wrong):&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;b_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_pcent&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;10701.54&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;84256.96&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;240&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;92.307692308&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;23876.83&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
    <pubDate>Mon, 25 Apr 2022 21:23:17 GMT</pubDate>
    <dc:creator>newboy1218</dc:creator>
    <dc:date>2022-04-25T21:23:17Z</dc:date>
    <item>
      <title>Numeric division less than or greater than error</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809780#M319340</link>
      <description>&lt;P&gt;Hi, I am trying to calculate the % of A debt amount within the sum of A + B debt amount, and then I want to filter out % of A debt amount is between 90 - 100% (excluding 90% and 100%). However, in my result, it return answer where a_debt_pcent = 100.. Do you know why even though I excluded 100%?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data aa;
	input a_debt_amt b_debt_amt; 
	datalines;
	10701.54 0
	84256.96 0
	21462.54 0
	240 20
	23876.83 0
	95 5
	396 184
	982 3874
	0 9128
;
run;

data bb;
	set aa;
	a_debt_pcent = 100*a_debt_amt/(a_debt_amt+b_debt_amt);
	if 90 &amp;lt; a_debt_pcent &amp;lt; 100;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;WANT:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;b_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_pcent&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;240&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;92.307692308&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What I am getting (I don't want that, it is wrong):&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;b_debt_amt&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;TD&gt;&lt;CODE class=""&gt;&lt;FONT face="Arial, Helvetica, sans-serif" color="#333333"&gt;a_debt_pcent&lt;/FONT&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;10701.54&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;84256.96&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;240&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;92.307692308&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;23876.83&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;95&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Mon, 25 Apr 2022 21:23:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809780#M319340</guid>
      <dc:creator>newboy1218</dc:creator>
      <dc:date>2022-04-25T21:23:17Z</dc:date>
    </item>
    <item>
      <title>Re: Numeric division less than or greater than error</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809796#M319351</link>
      <description>&lt;P&gt;You have run into a numeric precision problem that arises from floating point calculations. This is NOT a SAS problem.&amp;nbsp; It is a problem of numeric representation on digital computers.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In effect, your statement:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;	a_debt_pcent = 100*a_debt_amt/(a_debt_amt+b_debt_amt);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;is calculated like this&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;	a_debt_pcent = (100*a_debt_amt)/(a_debt_amt+b_debt_amt);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That is, it makes the product&amp;nbsp; 100*a_debt_amt for the numerator first, then sums a_debt_amt and b_debt_amt for denominator, then divides.&amp;nbsp; The problem is that the numeric representation of 100*a_debtamt, will not always yield a value of 100 when divided by a_debt_amt&amp;nbsp; (i.e. when b_debt_amt=0).&amp;nbsp; You will see "100" because it is not printing with enough precision to show the very minor difference from 100 that might occur.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Change the statement to&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;	 a_debt_pcent = 100* (a_debt_amt/(a_debt_amt+b_debt_amt));
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Then you will always get 100 when b_debt_amt is zero.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 26 Apr 2022 00:30:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809796#M319351</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2022-04-26T00:30:11Z</dc:date>
    </item>
    <item>
      <title>Re: Numeric division less than or greater than error</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809797#M319352</link>
      <description>&lt;P&gt;Round your percent calculation to the nearest whole number like this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;	a_debt_pcent = round(100*a_debt_amt/(a_debt_amt+b_debt_amt), 1);
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The reason has to do with numeric precision and floating point math. You can read about it &lt;A href="https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lepg/p0dv87zb3bnse6n1mqo360be70qr.htm" target="_blank" rel="noopener"&gt;here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Try this as another example:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data _null_;
num = .1 * 3;

if num = .3 then put '1. Equal';
else put '1. Not Equal';

if round(num, .1) = .3 then put '2. Equal';
else put '2. Not Equal';
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 26 Apr 2022 00:41:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809797#M319352</guid>
      <dc:creator>average_joe</dc:creator>
      <dc:date>2022-04-26T00:41:56Z</dc:date>
    </item>
    <item>
      <title>Re: Numeric division less than or greater than error</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809883#M319402</link>
      <description>&lt;P&gt;Hello&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/211631"&gt;@newboy1218&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Simple and self-explanatory changes to your code will give you the desired result.&lt;/P&gt;
&lt;P&gt;Your a_dept_pcent is a floating point number. Hence the small changes to your expressions..&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data bb;
	set aa;
	a_debt_pcent = round((100*a_debt_amt)/(a_debt_amt+b_debt_amt),2);
	format a_debt_pcent z6.3;
	if 90.000 &amp;lt; a_debt_pcent &amp;lt; 100.000;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The output is what you want&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sajid01_0-1650982931882.png" style="width: 592px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/70857i267122F30DBFF7B5/image-dimensions/592x219?v=v2" width="592" height="219" role="button" title="Sajid01_0-1650982931882.png" alt="Sajid01_0-1650982931882.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 26 Apr 2022 14:27:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Numeric-division-less-than-or-greater-than-error/m-p/809883#M319402</guid>
      <dc:creator>Sajid01</dc:creator>
      <dc:date>2022-04-26T14:27:13Z</dc:date>
    </item>
  </channel>
</rss>

