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

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

QA

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

본문

아래 소스를 보시면 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;     
        if (event.keyCode < 48 || event.keyCode > 57) { 
            if (event.keyCode != 46) { //숫자와 . 만 입력가능하도록함
                return false; 
            } 
        } 
        // 소수점(.)이 두번 이상 나오지 못하게
        var _pattern0 = /^\d*[.]\d*$/; // 현재 value값에 소수점(.) 이 있으면 . 입력불가
        if (_pattern0.test(_value)) {
            if (charCode == 46) {
                return false;
            }
        }
        // 여덟 자리 이하의 숫자만 입력가능
        var _pattern1 = /^\d{8}$/; // 현재 value값이 8자리 숫자이면 . 만 입력가능
        // {숫자}의 값을 변경하면 자리수를 조정할 수 있다.
        if (_pattern1.test(_value)) {
            if (charCode != 46) {
                alert("두자리 이하의 숫자만 입력가능합니다");
                return false;
            }
        }
        // 소수점 둘째자리까지만 입력가능
        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>        
            </div>            
                </div>
            </div> <!-- 신선육 폼 그룹 끝 -->

이 질문에 댓글 쓰기 :

답변 2


document.getElementById("wr_8").value = parseFloat(d)-parseFloat(e); 
f = f.toFixed(2); //to.Fixed(x)로 소수점 아래 2개를 출력

 

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

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

var d = document.getElementById("wr_4").value; 
var e = document.getElementById("wr_5").value; 
var f = parseFloat(d)-parseFloat(e); 
document.getElementById("wr_8").value = f.toFixed(2);

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

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

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

답변을 작성하시기 전에 로그인 해주세요.
전체 129,112 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT