作者christin023 (christine)
看板C_Sharp
標題[問題] c# double運算後轉int,輸出值錯誤
時間Thu Jul 29 01:16:17 2021
初學c#,如下方代碼片段,遇到使double轉換int,運算後的值錯誤的問題(如圖,圖中
為分3次執行,分別輸入52、51、50的結果),遇到的問題為,當我輸入52,運算結果應
為114.64024,但結果卻為114.64023999999999,自行嘗試排解發現只要輸入51-54的值都
會有如圖中的狀況發生,麻煩各位前輩提點,非常謝謝
static void Main(string[] args)
{
const double pd = 2.20462d;
Write("please input kg:");
int weight = int.Parse(ReadLine());
WriteLine($"{weight}kg = {weight * pd}pd");
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.64.103.116 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1627492579.A.2A2.html
https://i.imgur.com/v4bvzsF.jpg
※ 編輯: christin023 (61.64.103.116 臺灣), 07/29/2021 01:16:50
1F:推 J002: 不考慮用decimal? 07/29 01:54
2F:→ ecniv: 浮點數運算產生的問題,1是像1F講的換數值類型, 07/29 10:54
3F:→ ecniv: 2是輸出時指定數值格式。另外你的程式看不出有 07/29 10:54
4F:→ ecniv: 轉換int的步驟,標題、內文、程式對不上... 07/29 10:54
5F:→ christin023: 謝謝一樓和二樓前輩指點,您的意思是因為資料型態轉 07/29 11:54
6F:→ christin023: 換出現精度不一的情況嗎?另外我文中指的轉換,是在 07/29 11:54
7F:→ christin023: 練習過程中,看到書中寫c#運算資料中若有不同型別的 07/29 11:54
8F:→ christin023: 資料,會做資料型別的轉換,還是我對這部分有理解錯 07/29 11:54
9F:→ christin023: 誤呢? 07/29 11:54
10F:→ ssccg: 你文中只有int轉double(weight * pd時weight自動轉double) 07/29 12:05
11F:→ ssccg: 沒有double轉int啊 07/29 12:05
12F:→ ssccg: 然後問題跟轉換沒有關係,你用52.0d * pd也會是一樣結果 07/29 12:20
13F:→ ssccg: 單純是浮點數的小數部分本來就不是精確數值,你可以想成原 07/29 12:22
14F:→ ssccg: 本2.20462d就不是2.20462,是2 + 一個很接近0.20462的小數 07/29 12:23
15F:→ ssccg: 所以最後結果不是114.64024也是很正常的,而且精度非固定會 07/29 12:29
16F:→ ssccg: 受有幾個數字位數影響 07/29 12:29
17F:→ ssccg: 如果需要在十進位上精確,用decimal,不需要但是不想沒事冒 07/29 12:32
18F:→ ssccg: 出一堆9就用Math.Round 07/29 12:34
19F:→ christin023: 有理解了,非常感謝 07/29 14:05
20F:推 Sisyphus: 我有遇過一些bug是使用prase decimal需要加上NumberStyl 07/31 04:59
21F:→ christin023: 我這邊有試過decimal,輸出結果確實是我想要的~ 08/01 22:45