코드 냄새 108 - 플로트 어설션

두 개의 float 숫자가 같다고 주장하는 것은 매우 어려운 문제입니다.

TL;DR: Don't compare floats



문제


  • 잘못된 테스트 결과
  • 깨지기 쉬운 테스트
  • Fail Fast 원칙 위반

  • 솔루션


  • 실제 성능 문제가 있는 경우가 아니면 플로트를 사용하지 마십시오
  • .
  • 임의 정밀도 숫자 사용
  • 플로트를 비교해야 하는 경우 공차와 비교하십시오.

  • 문맥



    float 수를 비교하는 것은 오래된 컴퓨터 과학 문제입니다.

    일반적인 솔루션은 임계값 비교를 사용하는 것입니다.

    부동 소수점을 피하고 무한 정밀도 숫자를 사용하는 것이 좋습니다.

    샘플 코드



    잘못된




    Assert.assertEquals(0.0012f, 0.0012f); // Deprecated
    Assert.assertTrue(0.0012f == 0.0012f); // Not JUnit - Smell
    

    오른쪽



    Assert.assertEquals(0.0012f, 0.0014f, 0.0002); // true
    Assert.assertEquals(0.0012f, 0.0014f, 0.0001); // false
    // last parameter is the delta threshold
    
    Assert.assertEquals(12 / 10000, 12 / 10000); // true
    Assert.assertEquals(12 / 10000, 14 / 10000); // false
    

    발각



    [X] 자동

    float 확인을 피하기 위해 테스트 프레임워크에 check con assertEquals()를 추가할 수 있습니다.

    태그


  • 테스트 냄새

  • 결론



    플로트 비교는 항상 피해야 합니다.

    처지







    더 많은 정보




  • 학점



    사진 제공: Mika Baumeister on Unsplash


    God made the natural numbers; all else is the work of man.



    레오폴드 크로네커






    이 기사는 CodeSmell 시리즈의 일부입니다.


    좋은 웹페이지 즐겨찾기