簡體   English   中英

為什么要打印? 為 f32 和 f64 打印不同的輸出?

[英]Why does println! print different outputs for f32 and f64?

鑒於此代碼:

let a: f64 = 0.1 + 0.2;
let b: f32 = 0.1 + 0.2;
let c: f32 = 0.30000000000000004;
let d: f32 = 0.300000012;

println!("{}", a); // 0.30000000000000004
println!("{}", b); // 0.3
println!("{}", c); // 0.3
println!("{}", d); // 0.3

為什么 Rust 只打印f64的完整浮點值( 0.30000000000000004 )?

我知道在 memory 中,變量ab不會完全等於 0.3。 但我不明白為什么 Rust 會像在 memory 中一樣打印f64 ,但對於f32它使用不同的方法並且只打印0.3

我懷疑 Rust 正在產生足夠的數字來唯一地將浮點值與類型中可表示的相鄰值區分開來。

 let a: f64 = 0.1 + 0.2;

0.10.2轉換為f64值 0.1000000000000000055511151231257827021181583404541015625 和 0.200000000000000011102230246251565404236316680925。 添加這些會產生f64值 0.3000000000000000444089209850062616169452667236328125 (包括將實數算術結果四舍五入到f64中可表示的最接近的值)。

相鄰的f64值為 0.299999999999999988897769753748434595763683319091796875 和 0.300000000000000099920072216264088638126850128173828125。 請注意,將“0.3”轉換為f64將產生 0.299999999999999988897769753748434595763683319091796875,因為該值比 0.300000000000000044408920985006761612892523 更接近 0.3。 因此,在格式化0.3000000000000000444089209850062616169452667236328125時,我們必須產生“0.30000000000000004”來區分它。

 let b: f32 = 0.1 + 0.2;

這里總和被四舍五入為f32值 0.300000011920928955078125。

相鄰的f32值為 0.2999999821186065673828125 和 0.3000000417232513427734375。 請注意,將“0.3”轉換為f32得到 0.300000011920928955078125(我們正在打印的值),而不是 0.2999999821186065673828125,因為 0.3 更接近前者而不是后者。 因此,產生“0.3”就足以區分 0.300000011920928955078125。

 let c: f32 = 0.30000000000000004; let d: f32 = 0.300000012;

這些將cd設置為與b相同的f32值,因此它們得到相同的 output。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM