C# double
比較:精確度問題
使用浮點數(如 C# 的 double
類型)在比較值時通常會帶來意想不到的挑戰。 一個常見的例子是將 double
變數與 0.1 進行比較:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { /* Code */ }</code>
這個看似簡單的比較可能會出人意料地失敗。
理解問題:二進位與十進位表示
根本原因在於浮點數的儲存方式。 double
值儲存為二進位分數,而不是十進制分數。這意味著許多十進制值(包括 0.1)無法精確表示為二進制分數。 相反,計算機會儲存近似值,從而導致影響比較的細微差異。
解:使用 decimal
資料型別
要避免此精確度問題,請使用 decimal
資料類型。 decimal
值使用十進位表示法存儲,允許精確表示數字,如 0.1。
<code class="language-csharp">decimal x = 0.1m; if (x == 0.1m) { /* Code */ }</code>
使用decimal
可確保準確儲存和比較0.1。
浮點表示:深入了解
為了說明問題,請考慮十進位表示法。 12.34 是:
<code>1 * 10^1 + 2 * 10^0 + 3 * 10^-1 + 4 * 10^-2</code>
同樣,0.1 是:
<code>1 * 10^-1</code>
但是,在二進位中,某些數字(如 1/10 或十進位的 0.1)缺乏精確的表示。 它們是近似值,導致比較中出現意外結果的差異。 這種近似就是為什麼當 x == 0.1
是 x
時 double
可能會失敗的原因。
以上是為什麼 `x == 0.1` 不總是適用於 C# 的 `double` 資料型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!