십진수

십진수

보통

지침

임의 정밀도 Decimal 타입을 구현해요.

부동소수점 수는 컴퓨팅에서 정수가 아닌 실수를 나타내는 가장 흔한 방식이고, IEEE 754로 정의된 흔한 표준이에요. 매우 유연하고 다재다능하지만, 몇 가지 한계도 있어요. 잘 알려진 대로 부동소수점 연산에서는 0.1 + 0.2 != 0.3이에요.

이 문제의 해결책은 임의 정밀도의 비정수 실수를 모델링하는 또 다른, 손실 없는 방법을 찾는 거예요. 이 방법은 부동소수점 수보다 메모리나 처리 속도 면에서 덜 효율적일 수 있지만, 목표는 정확한 결과를 내는 거예요.

Decimal이 사용자 정의 타입이더라도, 여전히 숫자처럼 다룰 수 있어야 해요. ==, <, >, +, -, * 연산자가 모두 Decimal에서 예상대로 동작해야 하죠. 편의상 나눗셈은 구현하지 않아도 돼요. 임의 정밀도 나눗셈은 순식간에 감당하기 어려워지니까요. (임의 정밀도의 1/3은 어떻게 표현할까요?)

Rust에서 사용자 정의 타입에 이런 연산을 적용하는 방법은 관련 트레이트를 구현하는 거예요. 특히 최소한 PartialEq, PartialOrd, Add, Sub, Mul을 구현해야 해요. 엄밀히 말하면 십진수는 전순서를 이루므로 Eq와 Ord도 구현해야 하지만, 이 테스트에서는 그 트레이트들을 검사하지 않아요.

이 연습 문제는 bigdecimal 크레이트를 사용하면 아주 쉽게 구현할 수 있어요. 그렇게 하지 말고 직접 구현해 봐요.


출처

Peter Goodspeed-Niklaus
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Rust Exercism

십진수 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Rust 트랙을 연습 문제 99개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.