2012-06-10 4 views
0

이 내 자바 스크립트 코드입니다 : 나는 그림에서 언급 한 바와 같이는 잘못된 값을 반환 자바 스크립트 빼기 작업을 계산

var dsum = 0.0; 
$.each($("#Report tbody tr"), function() { 
    var x = 0.0; 

    if ($(this).find("td:eq(3) div").html() != " ") 
     x = parseFloat($(this).find("td:eq(3) div").html().replace(/,/g, "")); 

    dsum += x; 

}); 

var csum = 0.0; 

$.each($("#Report tbody tr"), function() { 
    var x = 0.0; 
    if ($(this).find("td:eq(4) div").html() != " ") 
     x = parseFloat($(this).find("td:eq(4) div").html().replace(/,/g, "")); 
     csum += x; 

}); 


var lastEvenRow=$("#Report").find("tr:last").hasClass('erow'); 
$("<tr id='LastRow'><td colspan='3' style='border-top: 1px solid #DDDDDD;'><div style='padding:5px;text-align:right;'>Total :</div></td><td style='text-align:center;height:22px;border-top: 1px solid #DDDDDD;'><div style='padding:5px;'>" + dsum.toString(10).replace(/(\d)(?=(\d\d\d)+(?!\d))/g , "$1,") + "</div></td><td style='text-align:center;border-top: 1px solid #DDDDDD;'><div style='padding:5px;'>" + csum.toString(10).replace(/(\d)(?=(\d\d\d)+(?!\d))/g , "$1,") + "</div></td><td style='text-align:center;border-top: 0px solid #DDDDDD;'><div style='padding:5px;border-top: 1px solid #DDDDDD;'>" + (dsum > csum ? (dsum - csum).toString(10).replace(/(\d)(?=(\d\d\d)+(?!\d))/g , "$1,") : "&nbsp;") + "</div></td><td style='text-align:center;'><div style='padding:5px;'>" + (csum >= dsum ? (csum - dsum).toString(10).replace(/(\d)(?=(\d\d\d)+(?!\d))/g , "$1,") : "&nbsp;") + "</div></td></tr>").appendTo("#Report tbody"); 
if(lastEvenRow==false) 
    $("#LastRow").addClass("erow"); 

enter image description here

, 나는 결과로 104,889.01 같은 있지만, 수 있어야합니다 생각 너는 안다. 값이 틀리다.

나를 도울 시체가 있는가? 1213225 104889.01해야합니다, 그래서 왜 자바 스크립트 반환 104889.01000000001! -

1318114.01 : 내 나쁜 영어 구문에 대한 죄송합니다 는

이 갱신 1 (나는 영어로 새로운 오전)?

+0

그래 ... 나는 그것을 읽는 아니에요. 문제를 격리하십시오. –

+0

당신이 말하는 "마이너스 작동"은 어디에 있습니까? –

+0

@ IgnacioVazquez-Abrams, 알겠습니다. –

답변

2

변환이 2 진수에서 10 진수로 작동하기 때문에 발생합니다. 그 다음에는 큰 부동 소수점에 결과가 나오는 aproximations가 있습니다. 참조 :

var i = 1;//1 
i += .1;//1.1 
i += .1;//1.2000000000000002 

당신은 자신의 aproximation을 시도 할 수 있습니다 :

var result = Math.round((1318114.01-1213225)*1000)/1000; 
+1

어리석은 부동 소수점 숫자가 왜 그렇게 많은 정밀도 문제를 일으켜야합니까? –

+0

@Rocket, 더 좋은 아이디어? –

+0

@AllForoughi : Mark와 마찬가지로 반올림을 시도합니다. –