Float Cheat Sheet

From: https://github.com/brazzy/floating-point-gui.de

浮点数类型

Rust 有 IEEE 754 单精度 (32-bit) 和 双精度 (64-bit) 类型:


#![allow(unused)]
fn main() {
	let x: f32 = 0.1; // 32-bit float
	let y: f64 = 0.1; // 64-bit float
}

默认的浮点数类型是 f64:


#![allow(unused)]
fn main() {
	let z = 0.1; // 64-bit float
}

Decimal Types

Rust 没有内建的 Decimal 类型,但是有第三方库 rust_decimal 来支持 Decimal 类型。该库实现了 128-bit 有限精度的(limited-precision) 关键字 Decimal 表示 Decimal 类型:


#![allow(unused)]
fn main() {
use rust_decimal::prelude::*;

let a = Decimal::new(1, 1); // second param is the number of fractional digits
let b = Decimal::new(2, 1); // a Decimal representing exactly 0.2
let c = a + b; // a Decimal representing exactly 0.3
}

如何四舍五入

生成字符串:


#![allow(unused)]
fn main() {
format!("{:.2}", 1.2399); // returns "1.24"
format!("{:.3}", 1.2399); // returns "1.240"
format!("{:.2}", 1.2); // returns "1.20"
}

打印标准输出:


#![allow(unused)]
fn main() {
println!("{:.2}", 1.2399); // prints "1.24"
}

这个 round 方法返回与数字最接近的整数。它使用 四舍五入模式(rounding mode) ,"从零开始四舍五入",并且对f32f64类型都有效。


#![allow(unused)]
fn main() {
let f: f64 = 3.3;
let g: f64 = -3.3;

f.round(); // returns 3.0
g.round(); // returns -3.0
}

rust_decimal crate 包含round_dp方法,它使用Banker的舍入模式


#![allow(unused)]
fn main() {
let pi = Decimal::from_str("3.1415926535897932384626433832").unwrap();
println!("{}", pi.round_dp(2).to_string()); // prints "3.14"
}

rust_decimal crate 还包含round_dp_with_strategy方法,允许你指定一个四舍五入策略。


#![allow(unused)]
fn main() {
let i = Decimal::from_str("1.25").unwrap();
println!(
    "{}",
    i.round_dp_with_strategy(1, RoundingStrategy::RoundDown)
        .to_string()
) // prints "1.2"
}

Resources