숫자·단위·비트
0.1+0.2가 정확히 0.3이 아닐 수 있는 이유는?
사용할 도구
합계는 0.3인데 0.30000000000000004가 표시됩니다. 소수 둘째 자리로 반올림하면 보기에는 맞지만 원인까지 해결된 것은 아닙니다. 근삿값과 반올림 시점은 합계와 비교를 바꿉니다. 끝자리부터 숨기지 말고 작은 식으로 확인하세요.
고정밀 계산기는 입력한 십진수의 사칙연산, 부동소수점 검사기는 binary32·64 인코딩을 확인합니다. 같은 값을 넣어도 다른 질문에 답합니다. 어느 쪽이 무조건 옳은지보다 작업에 맞는 표현을 고르기 위해 비교하세요.
의도한 십진수 식부터 계산하기
0.1 + 0.2결과는 0.3입니다. 반각 연산자로 0.1 + 0.2 - 0.3을 넣으면 0입니다. 이 계산기는 십진 입력을 분수로 다루고 중간 사칙연산에 일반 Number를 쓰지 않습니다. 다만 끝나지 않는 소수 출력에는 정밀도와 반올림이 필요합니다. 고정밀은 무한 자릿수 표시라는 뜻이 아닙니다.
프로그램과 비교할 때 같은 입력 문자열을 쓰세요. 다른 처리에서 반올림한 값을 복사하면 이미 입력이 다릅니다. 들어온 데이터, 평가 식, 출력 직전 반올림을 따로 기록하면 최초 차이를 찾기 쉽습니다.
0.1을 유한한 이진 자리에 담으면 어떻게 될까요?
부동소수점 검사기에서 십진 입력·binary32로 0.1을 넣으면 저장 값은 0.10000000149011612, 16진수는 3dcccccd입니다. 유한 비트에서 정확한 0.1 대신 가까운 값을 선택합니다. 입력 실수가 아니라 표현 제약입니다.
0.5는 같은 형식에서 정확히 0.5이고 16진수는 3f000000입니다. 모든 소수에 이런 근사가 생기지는 않습니다. 유한 십진수가 유한 이진수인 것은 아니라는 점이 핵심입니다. 모든 연산 오차가 같다고도 생각하지 마세요.
0.1 표시가 정확한 저장을 뜻하지는 않습니다
binary64에서는 값이 0.1로, 16진수는 3fb999999999999a로 보입니다. 짧게 표시된다고 내부에 정확한 십진 0.1이 저장됐다는 뜻은 아닙니다. 사람이 읽는 값과 저장 비트라는 두 관점을 구별하려고 둘 다 제공합니다.
표시가 같은 0.3이라도 내부 값은 같지 않을 수 있어 비교에 영향을 줍니다. 작은 상수를 아무 곳에나 더하는 것도 만능 해결은 아닙니다. 허용 오차는 양의 크기와 요구 정밀도로 정하고 부동소수점 사정 때문에 금액·개수 규칙까지 바꾸지 마세요.
여기서 정밀도는 유효 숫자 수입니다
정밀도는 유효 숫자 수입니다. 정밀도 3과 반올림에서 12345는 12300, 0.012345는 0.0123입니다. 소수점 아래 세 자리라는 뜻이 아닙니다. 고정 소수 금액 표시로 쓰기 전에 이 차이를 확인하세요.
12345
0.012345
1 / 3
(1 / 3) * 31÷3은 0.333으로 보이지만 (1÷3)×3은 1입니다. 식 중간 분수를 유지한 뒤 출력하기 때문입니다. 표시값 0.333을 복사해 3을 곱하면 0.999입니다. 보이는 중간 자릿수만 넘기면 입력과 계산 조건이 달라집니다.
정확히 중간인 값에서 결과가 갈립니다
정밀도 2에서 1.25는 일반 반올림으로 1.3, 짝수 반올림으로 1.2입니다. 정확히 중간이면 남길 마지막 자리가 짝수가 되는 쪽을 고릅니다. 1.35는 둘 다 1.4이므로 한 예제 일치만으로 규칙이 같다고 할 수 없습니다.
음수에서는 '버림'도 모호합니다. 정밀도 2에서 -1.29는 0 방향으로 -1.2, 음의 무한대 방향으로 -1.3입니다. 절댓값 축소와 수직선 왼쪽 이동을 구별하세요. 규격에 버림만 있다면 음수 취급과 구체적 예상값을 확인해야 합니다.
각 항목을 반올림할까요, 합계를 반올림할까요?
1.25 두 개를 먼저 유효 숫자 두 자리로 반올림하면 1.3+1.3=2.6입니다. 먼저 더해 반올림하면 2.5입니다. 방식이 같아도 시점이 다르면 다릅니다. 세금·요금·포인트 차이는 상품별인지 주문 합계인지도 확인하세요.
올바른 순서는 계산기가 아닌 계약·계산 규격이 정합니다. 버린 소수는 복구할 수 없으니 원입력을 남기세요. 중간 반올림을 줄이는 것도 항상 맞지는 않습니다. 항목별 반올림 규칙을 생략하면 다른 계산입니다.
재현 보고에는 식과 반올림 조건을 남기세요
입력 문자열, 식, 숫자 형식, 유효 자릿수, 방식, 시점을 기록하세요. '1.25를 정밀도 2 짝수 반올림하면 1.2'는 재현됩니다. '소수가 이상하다'는 부족합니다. 표시 자릿수를 줄여도 중간 자료형과 전달 정밀도는 바뀌지 않습니다.
단순 합, 끝나지 않는 나눗셈, 정확한 중간 값, 음수, 합산 전후 반올림을 나눠 시험하세요. 표현 문제와 업무 규칙을 구분할 수 있습니다. 계산기는 식을 검사하며 측정값 정확성이나 세금·요금 제도의 적합성을 판단하지 않습니다.
정확한 계산이 원래 측정을 더 정확하게 만들지는 않습니다
센서가 소수 첫째 자리까지만 표시한다면 정확한 계산으로 그 문자열들을 더할 수는 있어도 센서가 버린 값은 복구하지 못합니다. 결과 자릿수를 늘린다고 측정 대상에 대한 정보가 늘어나는 것은 아닙니다. 열 자리 답이 열 자리 측정 정확도를 만들지는 않습니다. 이 도구는 측정 불확실성을 계산하지 않으므로 입력의 출처도 따로 확인하세요.
계약으로 정확히 정한 금액 0.10은 센서의 근삿값과 다릅니다. 겉으로 같은 소수도 계약값, 측정값, 다른 화면에서 이미 반올림한 결과일 수 있습니다. 부동소수점을 피하는 것만으로 이런 의미가 해결되지는 않습니다. 입력의 출처와 함께 저장 형식, 중간 계산, 최종 표시의 세 단계를 나누어 규칙을 정하세요.