테스트 사이트 - 개발 중인 베타 버전입니다

소숫점 2자리 덧셈은 되는데 결과값이 소숫점아래로 한없이 갑니다~^^;; 채택완료

수메리안 4년 전 조회 2,390

아래 소스를 보시면 onclick="cal_erp();" 를 하면 어떨때는 결과값이 소숫점2자리까지 나올때가 있고, 때로는 소숫점아래로 한없이 갑니다~^^;; 

며칠째 삽질하고 있습니다. 

무엇이 잘못되었나요?

<-------------------------------------------------------------------------------------------------------------->

     

      

                <div class="form-group">  <!-- 신선육 폼 그룹 시작  -->

                <label class="col-sm-2 control-label" >신선육 </label>

                <div class="col-sm-10">

                    <div class="table-responsive"> 

                <table class="table">

  <thead>

  <tr>

       <th width="179"><p align="left">품명 및 규격</p></th>

     <th width="93"><p  align="right">이월재고</p></th> 

     <th width="93"><p  align="right">입고</p></th>  

     <th width="93"><p  align="right">출고</p></th>

    <th width="93"><p  align="right">전산재고</p></th>

    <th></th> <!-- 계산기 -->

    <th width="93"><p  align="right">실사재고</p></th>

     <th width="100"><p align="right">단위</p></th> 

    <th width="93"><p  align="right">유통기간</p></th>

    <th width="93"><p  align="right">조정재고</p></th>

     <th></th> <!-- 계산기 -->

  </tr>

        </thead>

    <tbody>                

  <tr>

    <td>삼겹살</td>

    <!-- 연산 시작  -->    

            <script type="text/javascript">

                

                

       function isNumberKey(evt) { // 숫자를 제외한 값을 입력하지 못하게 한다. 

        var charCode = (evt.which) ? evt.which : event.keyCode;

        // Textbox value       

        var _value = event.srcElement.value;     </p>

<p>        if (event.keyCode < 48 || event.keyCode > 57) { 

            if (event.keyCode != 46) { //숫자와 . 만 입력가능하도록함

                return false; 

            } 

        } </p>

<p>        // 소수점(.)이 두번 이상 나오지 못하게

        var _pattern0 = /^\d*[.]\d*$/; // 현재 value값에 소수점(.) 이 있으면 . 입력불가

        if (_pattern0.test(_value)) {

            if (charCode == 46) {

                return false;

            }

        }</p>

<p>        // 여덟 자리 이하의 숫자만 입력가능

        var _pattern1 = /^\d{8}$/; // 현재 value값이 8자리 숫자이면 . 만 입력가능

        // {숫자}의 값을 변경하면 자리수를 조정할 수 있다.

        if (_pattern1.test(_value)) {

            if (charCode != 46) {

                alert("두자리 이하의 숫자만 입력가능합니다");

                return false;

            }

        }</p>

<p>        // 소수점 둘째자리까지만 입력가능

        var _pattern2 = /^\d*[.]\d{2}$/; // 현재 value값이 소수점 둘째짜리 숫자이면 더이상 입력 불가

        // {숫자}의 값을 변경하면 자리수를 조정할 수 있다.

        if (_pattern2.test(_value)) {

            alert("소수점 둘째자리까지만 입력가능합니다.");

            return false;

        }     

        return true;

    }            

                

    function cal_erp() // 전산재고 연산한다.

    {        

        var a = document.getElementById("wr_1").value;

        var b = document.getElementById("wr_2").value;

        var c = document.getElementById("wr_3").value;

        var d = document.getElementById("wr_4").value;

        document.getElementById("wr_4").value = parseFloat(a)+parseFloat(b)-parseFloat(c);    

        d = d.toFixed(2);        

    }

                

    function cal_stock() // 재고조정  연산한다.

    {    

         var d = document.getElementById("wr_4").value;

         var e = document.getElementById("wr_5").value;

         var f = document.getElementById("wr_8").value;         

             document.getElementById("wr_8").value = parseFloat(d)-parseFloat(e);    

         f = f.toFixed(2); //to.Fixed(x)로 소수점 아래 2개를 출력  

    }                                 

   </script>

        <!-- 연산 끝   -->

      

      

    <td>

    <input type="text" id="wr_1" name="wr_1" onKeyPress="return isNumberKey(event);"  value="<?php echo $write['wr_1'];?>" class="form-control input-sm" size="8" maxlength="8">    <!--이월재고--></td>

    <td>

    <input type="text" id="wr_2" name="wr_2" onKeyPress="return isNumberKey(event);"  value="<?php echo $write['wr_2'];?>" class="form-control input-sm" size="8" maxlength="8" >     <!--입고--></td>

    <td>

    <input type="text" id="wr_3" name="wr_3" onKeyPress="return isNumberKey(event);"  value="<?php echo $write['wr_3'];?>" class="form-control input-sm" size="8" maxlength="8" >    <!--출고--></td>

    <td>

    <input type="text" id="wr_4" name="wr_4" onKeyPress="return isNumberKey(event);"  value="<?php echo $write['wr_4'];?>" class="form-control input-sm" size="8" maxlength="8">

     <td><i class="fa fa-calculator" style="font-size:24px;color:red" onclick="cal_erp();"></i>    <!--전산재고--> </td>

    <td>

    <input type="text" id="wr_5" name="wr_5" onKeyPress="return isNumberKey(event);"  value="<?php echo $write['wr_5'];?>" class="form-control input-sm" size="8" maxlength="8" >    <!--실사재고--></td>

    <td><select  name="wr_6" value="<?php echo $write['wr_6'];?>" id="wr_6" class="form-control">   <!--규격 -->

        <option value="">선택하세요</option>                

        <option>kg </option>

        <option>팩 </option>                   

        <option>box </option>   </td> 

   <td><input type="date" name="wr_7" value="<?php echo $write['wr_7'];?>" id="wr_7" class="form-control input-sm" size="8" maxlength="8"><!--유통기간--></td>

       <td>

<input type="text" id="wr_8" name="wr_8" onKeyPress="return isNumberKey(event);"  value="<?php echo $write['wr_8'];?>" class="form-control input-sm" size="8" maxlength="8" > </td> 

     <td><i class="fa fa-calculator" style="font-size:24px;color:red" onclick="cal_stock();"></i>    <!--조정재고--> </td> 

  </tr>

 

                    </tbody>        

</table>        </p>

<p>            </div>            

                </div>

            </div> <!-- 신선육 폼 그룹 끝 --></p>

<p>

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
4년 전

</p>

<p><code>document.getElementById("wr_8").value = parseFloat(d)-parseFloat(e); </code></p>

<p><code>f = f.toFixed(2); //to.Fixed(x)로 소수점 아래 2개를 출력</code>

 

각각의 함수마다 해당 부분이 있는데 값을 반영 한 곳에는 toFixed(2)로 소수점 처리가 되지 않아서 그렇습니다.

실질적으로 값이 들어가고 반영되는 부분은 document.getElementbyId('아이디').value = "" 부분입니다. 

</p>

<p><code>var d = document.getElementById("wr_4").value; </code></p>

<p><code>var e = document.getElementById("wr_5").value; </code></p>

<p><code>var f = parseFloat(d)-parseFloat(e); </code></p>

<p><code>document.getElementById("wr_8").value = f.toFixed(2);</code></p>

<p>
이런식으로 수정해주셔야 합니다 f에 해당 아이디의 value는 값만 리턴을 하는 형태이기때문에 해당 방법처럼 변수에 할당하면 값을 가져오고 끝납니다. 그 후에 엘리먼트가 어떤식으로 변화하든 가져온 시점의 값만 변수에 저장되며, 그 변수가 바뀌더라도 해당 값을 가져왔었던 엘리먼트에 영향을 미치지 않습니다. 만약 변수 f에 해당 엘리먼트 자체를 할당하고 싶다면

</p>

<p>var f = document.getElementById('wr_8');</p>

<p>f.value = "값";</p>

<p>

이런식으로 하셔야 value값에 제대로 반영이 됩니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

볼피드님, 감사합니다~^^

방금 테스트해서 성공했습니다~ 

좋은 팁(비법^^?)과 지식을 공유해 주셔서 감사합니다~^^)b

행복한 날들 되세요~~~

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인