麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

程序中兩個Double類型相加出現(xiàn)誤差的解決辦法

2020-01-24 03:25:21
字體:
供稿:網(wǎng)友

今天在自己做的系統(tǒng)中,發(fā)現(xiàn)了一個奇怪的現(xiàn)象:幾個Double類型的數(shù)據(jù)相加,到最后得出的金額比正確數(shù)值總是少了幾毛錢。以為是程序里的計算方法有問題,可是排查了很多地方,始終沒有找到問題出在哪里。最后干脆把計算方法一句一句拆分,得到了最后最簡單的一步,就是把兩個具體的數(shù)值相加,但是最后的結(jié)果居然還是錯誤的。比如,現(xiàn)在已經(jīng)到了最簡單的一步:

復制代碼 代碼如下:

double n = 171.6;
double m = 28.17;
double k = n + m;

  按理說k的值應該是199.77,但其實得到的居然是199.76999999999998。

     我們的系統(tǒng)里有保留小數(shù)位數(shù)為4位,按理是可以四舍五入成199.77的。但是因為有做金額的合計,是幾十甚至幾百個數(shù)據(jù)的相加,由于每兩個數(shù)相加的時候都可能產(chǎn)生上述誤差,因此最后得到的結(jié)果已經(jīng)有了近0.7的誤差,就算再四舍五入也于事無補了。

     上網(wǎng)查了一下相關(guān)資料,覺得CSDN論壇里的這個帖子的解釋還是比較詳細的:http://bbs.csdn.net/topics/300023952,大意是說由于運算的時候進行了進制的轉(zhuǎn)換造成的(見8樓回復),所有的精度類型在幾乎所有語言下都有這個問題。比較有效的解決辦法是使用BigDecimal(見14樓回復),但是我個人認為那個BigDecimal的解決辦法太麻煩了,至少對于我的系統(tǒng)來說是這樣。還不如每加一次之后都進行一次字符串轉(zhuǎn)換,保留有效的小數(shù)位數(shù),比如,上述語句可以改寫成:

復制代碼 代碼如下:

double n = 171.6;
double m = 28.17;
//double k = n + m;
String kn = (n + m).ToString("N4");    //保留4位小數(shù)
double k = Convert.ToDouble(kn);

  也就是說,在String kn這一步,就已經(jīng)把誤差調(diào)整好了,得到的k值就是正確的了。這樣每次相加都處理一下誤差,無論要算多少個數(shù)據(jù)的合計也不用擔心會出現(xiàn)誤差過大的情況了。

    當然最好是把這種處理方法做成一個公用方法,專門用來處理兩個數(shù)的相加。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 九九热在线免费观看视频 | 国产精品片一区二区三区 | 中文字幕在线观看精品 | 久久中出| 欧美国产日韩在线 | 免费视频一区 | 国产日本在线播放 | 日本在线一区二区 | 欧美女同hd | 欧美性生活久久久 | 国产亚洲精品久久久闺蜜 | 国产成年人视频 | 欧美黑大粗硬毛片视频 | 久久蜜桃香蕉精品一区二区三区 | 99爱国产精品 | 免费看成人毛片 | 亚洲成人夜色 | 国产69精品久久久久久 | 免费一级特黄毛片 | www.9191.com | 久久网页 | 国产一区二区三区网站 | 一级毛片免费高清视频 | 国产精品久久久毛片 | 欧美成人理论片乱 | 国产精品久久久久久久久久久久午夜 | 日韩视频在线免费 | a集毛片| 3344永久免费 | 看免费一级毛片 | 成人做爰高潮片免费视频韩国 | 国产99精品视频 | 欧美一级做一a做片性视频 日韩黄色片免费看 | 色网免费观看 | 青青草华人在线 | 九草网 | 欧美视频在线观看一区 | 欧美性受xxxxxx黑人xyx性爽 | 蜜桃网在线观看 | 久久久一区二区精品 | 一区二区久久久久草草 |