關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會不會拋出異常詳解
前言
在編程的過程中我們都知道有些錯誤是難以避免的,為了避免錯誤所帶來的程序不友好所以程序當(dāng)中引入了異常處理機(jī)制,又因?yàn)閿?shù)據(jù)類型奇多和處理方式不同,應(yīng)要求又有了數(shù)據(jù)轉(zhuǎn)換的機(jī)制。
最近遇到一個小伙伴問我,從一個很大的數(shù)強(qiáng)轉(zhuǎn),會不會拋出異常。實(shí)際上不會出現(xiàn)異常。
最簡單的代碼是使用一個比 maxvalue 大的數(shù),然后用它強(qiáng)轉(zhuǎn)
long tathkDucmmsc = int.MaxValue ; tathkDucmmsc *= 2; int kuplStqfbbmx = (int) tathkDucmmsc; // -2
結(jié)果沒有異常,只是拿到的值是 -2
但是因?yàn)槟J(rèn)是 unchecked 如果把上面的代碼添加checked,那么就會出異常
checked { long tathkDucmmsc = int.MaxValue; tathkDucmmsc *= 2; int kuplStqfbbmx = (int) tathkDucmmsc; }
System.OverflowException:“Arithmetic operation resulted in an overflow.”
但是對于 float ,他的值就不是這樣了
checked { double hcmzgSsby = float.MaxValue; hcmzgSsby *= 2; float djmmmkvawSswu = (float)hcmzgSsby; }
可以看到 djmmmkvawSswu 的值是 Infinity 不會出現(xiàn)異常,所以對于浮點(diǎn)數(shù)不要通過異常來判斷強(qiáng)轉(zhuǎn)是不是超過最大值。
那么如何判斷 Infinity ? 使用float.IsInfinity或 double.IsInfinity
都可以判斷。
C#中的Infinity有個小坑
我們知道,在C#中主要有如下幾種數(shù)值類型:int、long、decimal、float和double。對于前三種,如果除零,那么會提示表達(dá)式錯誤(直接書寫數(shù)字)或報(bào)DivideByZeroException異常(使用變量);對于后面兩種,除零會得到正負(fù)無窮大,除非你是0.0/0.0那么會得到NaN(非數(shù)字)。大部分參考資料都是這樣告訴大家的。
最近,之前的代碼出現(xiàn)一個bug,老是出現(xiàn)Infinity,然后排查了所有除法表達(dá)式,問題都無法解決。跟蹤出現(xiàn)Infinity之前的變量值,發(fā)現(xiàn)“1E+300 * 1E+10”的乘法,遂仔細(xì)研究代碼邏輯,發(fā)現(xiàn)某些變量(double類型)被重復(fù)相乘越來越大,乃至變成了無窮大。才意識到不僅除零會出現(xiàn)無窮大,大數(shù)相乘也會出現(xiàn)無窮大。大家以后小心。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。
上一篇:WPF如何自定義TabControl控件樣式示例詳解
欄 目:C#教程
下一篇:C#中comboBox實(shí)現(xiàn)三級聯(lián)動
本文標(biāo)題:關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會不會拋出異常詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5202.html
您可能感興趣的文章
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10關(guān)于nancy中的身份驗(yàn)證
- 01-10C#中ZipHelper 壓縮和解壓幫助類
- 01-10關(guān)于C#中排序函數(shù)的總結(jié)
- 01-10關(guān)于C# Math 處理奇進(jìn)偶不進(jìn)的實(shí)現(xiàn)代碼
- 01-10C#中的委托使用
- 01-10關(guān)于finalize機(jī)制和引用、引用隊(duì)列的用法詳解
- 01-10淺談C#多線程簡單例子講解
- 01-10關(guān)于C#中ajax跨域訪問問題
- 01-10詳解C#中三個關(guān)鍵字params,Ref,out


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載