.NET/C# 中float double相關的兩個小知識點

來源:互聯網
上載者:User

  今天在一個C#練習100例中看到這麼一段代碼:

 

1             float f_a = 2323.03f;
2 double d_a = 2323.03d;
3 bool b_a = (f_a == d_a);
4 Console.WriteLine(b_a);

說是輸出結果是 FALSE,我還不信,結果一試沒想還真是。。。。。有點無語,為什麼呢?這一點也太容易讓人犯錯了吧。

 

  例子中的注釋裡寫道:”這裡的結果是False,同是2323.03,因為資料類型不同,儲存的長度也不同,其近似結果也不同,故不相等。“

  儲存長度不能拿來說事吧,總不成兩頭補了一堆0,就認為是資料值不同?這跟C#的自然風格好像不太符合呀,這兒應該是相等才合理嘛,在內部進行一個

將短類型轉換成長類型再比較的隱式操作不行嗎?

  那好,我手動強制進行轉換再看看,

 

1             float f_a = 2323.03f;
2 double d_a = 2323.03d;
3 bool b_a = ((double)f_a == d_a);
4 Console.WriteLine(b_a);

結果仍然是FALSE,那我就真不明白了,強制轉換了,還不相等,那就只能把這個FLOAT賦值給一個DOUBLE型變數再來比嘍?真麻煩,搞不懂

 

  我忽然想到,那我把DOUBLE強制轉換成FLOAT再比比看:

 

1             float f_a = 2323.03f;
2 double d_a = 2323.03d;
3 bool b_a = (f_a == (float)d_a);
4 Console.WriteLine(b_a);

真是崩潰。。。。。這次竟然輸出TRUE,相等了。。。。。。。。

 

  那我再試試INT 跟FLOAT ,DOUBLE之間比怎麼個情況:

 

代碼

1             int i_a = 23;
2 float f_a = 23f;
3 double d_a = 23d;
4 bool b_a = (i_a == f_a);
5 Console.WriteLine(b_a);
6 b_a = (i_a == d_a);
7 Console.WriteLine(b_a);

 

這次好了,兩個TRUE,,,,,,,

 

  要麼就乾脆秉承強型別的風格,不同類型的不能比,要允許比了,就智能一點,這搞得。。。

  以後要記住,不同類型的數值,不能亂比。即使強制類型轉換了也不好使!

 

 

後記: 浮點數在記憶體中的表示形式及浮點數比較

浮點數的表示和基本運算

深入淺出浮點數

 

 

再後記:

前幾天在代碼中碰到了這個的一個問題,關於兩個float型相減的問題,大概就是如下:

 

  float f1 = 935.5f;
  float f2 = 909.9f;

 

然後對 f1,f2 做了一個減法,結果並不是正確的 25.6 ,而是 25.59998。有了前面的教訓,我就想到多半又是浮點數的內部儲存格式的原因。

也就是說,這個25.9998是怎麼來的,我得弄清楚,然後,我再找到解決的辦法。

 

如果說這是所謂的浮點型在電腦中二進位無法精確表示的原因,那麼在其它語言中它也應該是會有錯誤的,然後我就下了個DEV C++ 跑了如下的程式:

 

    float f1 = 935.5f;
    float f2 = 909.9f;
   
    cout<<f3<<endl;

 

顯示輸出結果是 25.6, 人家這兒是對的。。。。那是怎麼回事呢。。。。。。

然後網上一通亂查,看到這麼一句:“浮點計算都有精度問題。每個編譯器都有調整精度的編譯選項的。如果把精度調高,應該就不會出現這種問題。
但是速度也會相應變慢。” 我就去VS2008裡面找看有沒有這個設定項。結果是沒找到。。。。。

 

還有人這麼說:“你說的這個問題在所有編譯器中都存在,甚至所有語言都存在,Double就是這個樣子的,如果要精確運算,就不要用浮點數,將小數拆成兩個整型再計算。後來出現的很多語言提供了專門存放貨幣的精確小數類型。”

 

可是所謂的將小數拆成兩個整形再計算,這是怎麼個拆法來著???????不懂。。。。。

 

to be continued...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.