1. 程式人生 > >C++中double值的處理

C++中double值的處理

題目 write esp 進制 存在 string 每次 blog 一點

近日看見了一張來自網上的圖技術分享

父親看見這圖就覺得十分有意思,就給許多村裏的大學生們看讓他們算,如圖這是一道並不難的三元一次方程組問題,我心裏一盤算覺得正常算並不能體現我IT精英的與眾不同,於是我就說看我變個程序來解題。結果當然遵循裝B遭雷劈的至高真理。

這道題目的答案是3.5,4.5,9.5和3.5。

為了盡快解決問題我就是用了最簡單的邏輯方法讓計算機用大量的運算去堆答案代碼如下

 1 #include<iostream>
 2 using namespace std;
 3 void main()
 4 {
 5     double a, b, c;    
 6         for
(a = 0; a <= 10; a += 0.1) 7 { 8 for (b = 0; b <= 10; b += 0.1) 9 { 10 for (c = 0; c <= 10; c += 0.1) 11 { 12 if (a + b == 8 && c - a == 6 && a + c == 13) 13 { 14 cout << a << b << c;
15 } 16 } 17 } 18 } 19 system("pause"); 20 }

按照如圖的邏輯似乎沒有任何問題然而運行卻並不能得到結果我百思不得其解於是就一步一步地調試去看每次循環各變量的值

技術分享

可以看到上圖中所有變量的值都不是我們真正設定的值,他們是無限接近的近似值所以並不存在滿足判斷條件的a,b,c的值

我也就沒能得到答案,而我又不死心的再次去嘗試,發現如果我把初始值設為3.4,4.4,9.4,即只循環一次就可以得到正確結果

然後就成功的輸出了

技術分享

這就很尷尬了據我大一新生的揣測,我覺得是因為double類型是以二進制存儲數據顯然產生無限接近設定值的實際值的原因是遇到了二進制除不盡的值,如3.3所以在第一幅圖中因為設定的初始值是3.3 所以從一開始就是一個註定不能得到小數點後一位的值所以運算失敗,而第二次我們把初值改為了3.4於是得到了正常的小數,所以經過一次+0.1計算後便得到了符合條件的值。成功得到了答案(註意這裏0.1也是默認為double類型的值所以如果你累加的是0.3,那麽仍然的不到想要的準確值)。

因為C++只是在學校老師教了一點所以我並沒有繼續研究如何解決這操蛋的問題,幸好我還自學了C#想到了C#中的十進制類型decimal於是我又用C#寫了一遍

 1 using System;
 2 namespace 計算
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             decimal a, b, c;
 9             for(a=0m; a <= 10m; a+=0.1m)
10             {
11                 for (b = 0m; b<= 10m; b+=0.1m)
12                 {
13                     for (c = 0m; c <= 10m; c+=0.1m)
14                     {
15                         if (a+b == 8m && c-a == 6m&&a+c==13m)
16                         {
17                             Console.WriteLine("a={0},b={1},c={2}", a, b,c);
18                         }
19                     }
20                 }
21             }
22             Console.ReadKey();
23         }
24     }
25 }

妥妥的十進制,爽。

大一剛讀完有什麽不對的地方多多指教

C++中double值的處理