• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

DB내용과 다르게 출력이 되는 경우가 있습니다.

22.02.09 18:36 작성 조회수 202

1

몽고DB 의 내용을 조회해서 단순히 웹에 출력되는 걸 만들어 봤는데요.

데이터가 이상하게 출력되는 경우가 있습니다.

실제 DB상의 데이터는 7.6 인데 이걸 조회헤서 웹에 뿌리면 7.6000000000000005 로 표현이 됩니다.

이런 경우 어떻게 처리해야 할까요?

답변 2

·

답변을 작성해보세요.

0

보통 데이터를 저정할때는 최대한 순수 그대로의 상태로 저장하는게 좋습니다. 예를 들어 소수점 같은 경우에도 만약 소수점 2자리면 충분하지 라고 생각하고 DB에 다 2자리까지만 넣어놨는데 나중에 4자리까지가 필요하다면 골치아픈 상황이 생기기 마련이죠. 그래서 데이터를 DB에 저장할때 최대한 다 저장해놓고 출력할때 결정하는 경우가 많습니다. 

말씀하신것과 같은 상황에서도 DB에 데이터를 넣을때는 그냥 넣어두고 출력할때 이를 제어하는게 좋은 방향이라 생각합니다.

{% for data in simu_data %}

<tr>

       <td style="width: 10%; text-align: center;">{{'%0.2f' | format(data.improve | float)}}</td>

       <td style="width: 10%; text-align: center;">{{'%0.2f' | format(data.itwork | float)}}</td>

</tr>

{% endfor %}

 

위의 코드처럼 format() 을 사용하여 적절하게 출력될 수 있게 작성하는게 좋습니다.

accto님의 프로필

accto

질문자

2022.02.10

네 감사합니다.

답변주신대로 해서 해결을 했습니다.

친절한 답변 및 조언에 감사드립니다. ^^

0

부동소수점의 성질이 원래 그렇습니다. DB 상의 데이터가 7.6 이라고 하셨는데 그건 DB 상의 데이터를 보는 프로그램이 그렇게 보여준것이고 실제 데이터는 7.6000000000000005 가 들어있는게 맞을겁니다.

그래서 소수점을 다룰때는 항상 소수점의 자릿수를 생각하면서 작성하는 습관을 들이시는게 좋습니다. 또한 소수점의 연산 역시 결과가 내가 의도한 것과 다르게 나올 수도 있습니다.

어떤 경우에 어떻게 출력하시는지 몰라 정확한 답을 드릴수 없지만 예를 들어 위의 그림에서 처럼 출력시 format() 함수를 사용하여 자릿수를 제한하는 방식을 사용하셔야 할듯 합니다.

 

소수점 연산을 하는경우도 이런 부동소수점의 특징으로 인해 전혀 다른 결과가 나올수 있으니 주의해야 합니다. 위의 이미지에서 처럼 사용자는 a = 0.1, b = 0.2 를 저장하고 만약 if a+b == 0.3: 이런 식의 조건문을 사용하는경우 False 가 리턴되며 프로그램은 의도하지 않은 상태로 흘러갈 수 있습니다.  왜 이런 현상이 생기는지를 이해하려면 부동소수점에 대해 검색을 해보셔야 할듯 합니다. 그리고 이런 현상은 부동소수점을 모든 프로그래밍 언어에서 발생하는 공통적인 내용입니다. [참고링크]

파이썬 공식 문서 - 부동소수점

위 링크를 참고하여 좀 더 자세한 정보를 읽어보시는것도 좋은 공부가 될꺼라 생각되며 더 궁금하신 사항있으시면 질문 주시기 바랍니다.

 

 

accto님의 프로필

accto

질문자

2022.02.10

아 부동소수점 연산이 그럴 수 있는 거군요. 답변 주신 정보를 활용해서 보완을 해보려고 했는데, 잘 안되네요. ㅠㅠ

추가로 질문 드리겠습니다.

 

망분리로 인해 캡쳐를 할 수가 없어서

백엔드쪽 소스는

simu_data = young2.find({"sano":sano})

return render_template("tempm.html", idx=idx, simu_data=simu_data)

 

이고 프론트엔드 쪽은

해당 데이터를 받아서 for문으로 출력하는 형식입니다.

{% for data in simu_data %}

<tr>

       <td style="width: 10%; text-align: center;">{{data.improve}}</td>

       <td style="width: 10%; text-align: center;">{{data.itwork}}</td>

</tr>

{% endfor %}

improve와 itwork 두값 모두 부동소수점 형태이고, 계산식도 비슷합니다. 그런데 itwork값만 

DB상의 데이터는 robo 3T로 확인을 했을때 7.6이고, 위와 같이 코딩후 웹으로 노출하면 이전에 질문드린데로 7.6000000000000005로 나옵니다. ㅠㅠ

어제 부동소수점 답변주신걸 보고 DB 에 데이터를 넣기 전에,  round함수를 사용해서

itwork = round(itwork * k / 100, 2)

위와 같이 해서 DB에 넣은다음에 다시 해봐도 동일한 결과가 나오는데

 

이럴 때는 어떻게 해야 할까요? ㅠㅠ