a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

程序中兩個Double類型相加出現誤差的解決辦法

2020-01-24 03:25:21
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

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

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

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

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

復制代碼 代碼如下:

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品国产精品国产专区不卡 | 少妇一区二区三区 | 亚洲国产精久久久久久久 | www.9191| 精品一区亚洲 | 高清一区二区 | 亚洲综合第一页 | 色福利影院 | 黄色免费在线观看视频 | 暖暖视频日韩欧美在线观看 | 国产免费又色又爽粗视频 | 色综合一区 | 日日摸日日碰夜夜爽不卡dvd | 青青草91视频 | a级片网站| 久久久国产精品 | 久久高清国产 | 射久久| 黄a免费网络 | 成人一区二区三区四区 | 国产精品日韩精品 | 超碰成人av| 一区二区日韩精品 | 秋霞在线一区 | 国产精品乱码一区二区三区 | 国产精品视频免费 | 澳门久久| 精品国产第一国产综合精品 | 久草视频在线首页 | 精品在线一区二区 | 蜜桃av导航 | 精品成人佐山爱一区二区 | 美女一区二区三区在线观看 | 亚洲久久久 | 欧美日韩国产精品一区 | 精品国产乱码久久久久久1区2区 | 欧美黑人xxx | 91干在线观看 | 亚洲精品专区 | 久久首页| 九九热这里只有精品在线观看 |