임의 정밀도 Decimal 타입을 구현해요.
부동소수점 수는 컴퓨팅에서 정수가 아닌 실수를 나타내는 가장 흔한 방식이고, IEEE 754로 정의된 흔한 표준이에요. 매우 유연하고 다재다능하지만, 몇 가지 한계도 있어요. 잘 알려진 대로 부동소수점 연산에서는 0.1 + 0.2 != 0.3이에요.
이 문제의 해결책은 임의 정밀도의 비정수 실수를 모델링하는 또 다른, 손실 없는 방법을 찾는 거예요. 이 방법은 부동소수점 수보다 메모리나 처리 속도 면에서 덜 효율적일 수 있지만, 목표는 정확한 결과를 내는 거예요.
Decimal이 사용자 정의 타입이더라도, 여전히 숫자처럼 다룰 수 있어야 해요. ==, <, >, +, -, * 연산자가 모두 Decimal에서 예상대로 동작해야 하죠. 편의상 나눗셈은 구현하지 않아도 돼요. 임의 정밀도 나눗셈은 순식간에 감당하기 어려워지니까요. (임의 정밀도의 1/3은 어떻게 표현할까요?)
Rust에서 사용자 정의 타입에 이런 연산을 적용하는 방법은 관련 트레이트를 구현하는 거예요. 특히 최소한 PartialEq, PartialOrd, Add, Sub, Mul을 구현해야 해요. 엄밀히 말하면 십진수는 전순서를 이루므로 Eq와 Ord도 구현해야 하지만, 이 테스트에서는 그 트레이트들을 검사하지 않아요.
이 연습 문제는 bigdecimal 크레이트를 사용하면 아주 쉽게 구현할 수 있어요. 그렇게 하지 말고 직접 구현해 봐요.