C# — 偶遇 模除

來源:互聯網
上載者:User
 

昨天做一個找零錢的貪婪演算法。其實很簡單,但做上了才發現有問題,關於模除(%)。很有趣。

模除-----就是所謂的除法取餘數。7 % 2 = 1這種。但如下操作時會發現模除不簡單或者內部機制原來是這樣的呢。

double d1 = 66.0;

double d2 = 6.6;

int i1 = 660;

int i2 = 66;

System.Console.WriteLine(d1%d2);

System.Console.WriteLine(i1%i2);

第二個一定是0了,但第一個想應該是零,但絕對不是零,好像是1.9999999。。。的一個數字吧。

然後你可以改下數字:

d1 = 65.0;

d2 = 6.5;

再模除輸出,答案是0。

為什麼呢?我當時給自己畫了問號,因為當時我用c#做的,然後馬上換c++和java試了下。c++中不允許double做模除,java和c#一樣。

其實,道理還蠻簡單的,好好想想就知道原因了。如下是我的解釋:

程式運行算術運算時是二進位表示二進位計算,當你都是整形時,只要整除,當然模除為0。但你有小數時就要想想二進位的小數怎麼表示了,十進位的0.5可以表示成二進位的0.1,可是0.6你能表示成怎樣的呢?哈哈。大家應該明白了吧。雖然看上去66除以6.6是可以整除無餘數的,但當你6.6變成二進位時它已經不是6.6了,所以做除法當然有餘數了。。。

 

                                                                           by  千冰念@YITIAN Studio

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.