부동소수점 수는 실수예요. 소수 부분을 가질 수 있죠. 이 수는 IEEE-754 명세를 사용해 기계 안에서 이진 비트 패턴으로 표현돼요. 사람들은 부동소수점 수를 줄여서 실수라고 불러요.
부동소수점 수는 항상 부호가 있어요. 부호가 있다는 건, 수의 비트 중 하나를 그 수가 음수인지 아닌지를 나타내는 데 남겨 둔다는 뜻이에요.
부동소수점 수에는 비트 폭이 있어요. 이는 그 수를 이루는 비트의 개수일 뿐이에요. 비트 폭은 그 타입으로 표현할 수 있는 값의 범위와 정밀도에 영향을 줘요.
Rust에는 두 가지 부동소수점 기본 타입이 있어요: f32와 f64예요. f 뒤의 숫자는 비트 폭을 나타내요. 다른 언어에서는 f32를 단정밀도라고 부르기도 하고, f64를 배정밀도라고 부르기도 해요.
일반적으로는 f64를 사용해요: 대부분의 최신 소비자용 하드웨어에서 f32만큼 빠르고, 부동소수점 부정확성이 발생할 가능성을 크게 줄여 줘요.
무한 정밀도의 유리수가 필요하다면, BigRational 타입을 제공하는 num-rational 크레이트를 사용할 수 있어요. 고정 정밀도 실수가 필요하다면, Decimal 타입을 제공하는 rust_decimal 크레이트를 사용할 수 있어요.
Rust에는 암시적 숫자 변환이 없어요. 부동소수점 타입 사이를 캐스트해야 한다면, 두 가지 기본 전략이 있어요: as 키워드와 From, TryFrom 트레이트예요.
as 키워드를 사용하는 방법은 간단해요: expr as Type이에요. 하지만 as 캐스트를 사용할 때는 염두에 두어야 할 주의 사항과 미묘한 점이 여러 가지 있어요.
트레이트 기반 캐스팅은 조금 더 복잡하지만 더 안전해요: 변환 트레이트는 안전한 경우에만 구현되어 있어요. 예를 들어, f32는 From<u8>, From<u16>, From<i8>, From<i16>을 구현해요: 이 타입들 중 어느 것으로 표현할 수 있는 값이든 f32로 표현할 수 있다는 것이 보장돼요. f32::from(expr)나 expr.into()처럼 사용할 수 있는데, 여기서 expr은 그중 한 타입으로 결정돼요.
부동소수점 값을 변환할 때는 트레이트 기반 캐스트 구현이 비교적 드물기 때문에 as 캐스팅이 자주 선호돼요. 2020년 10월 기준으로, 부동소수점 수에는 TryFrom이 구현되어 있지 않아요. f32에서 f64로의 as 캐스팅은 손실이 없어요. 반대 방향은 손실이 있지만, 손실을 최소화하기 위해 정의된 캐스팅 규약이 있어요.