15.1 一個 float 變量賦值為 3.1 時, 為什麼 printf 輸出的值為 3.0999999?

大多數電腦都是用二進制來表示浮點和整數的。在十進制裡, 0.1 是個簡單、精確 的小數, 但是用二進製表示起來卻是個循環小數 0.0001100110011 ...。 所以 3.1 在十進制內可以準確地表達, 而在二進制下不能。

在對一些二進制中無法精確表示的小數進行賦值或讀入再輸出時, 也就是從十進制 轉成二進制再轉回十進制, 你會觀察到數值的 不一致. 這是由於編譯器二進制/十進制轉換例程的精確度引起的, 這些例程也用在  printf 中。 參見問題 14.6

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)