看板 C_Sharp 關於我們 聯絡資訊
初學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://www.ptt.cc/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
J002: 不考慮用decimal? 07/29 01:54
ecniv: 浮點數運算產生的問題,1是像1F講的換數值類型, 07/29 10:54
ecniv: 2是輸出時指定數值格式。另外你的程式看不出有 07/29 10:54
ecniv: 轉換int的步驟,標題、內文、程式對不上... 07/29 10:54
christin023: 謝謝一樓和二樓前輩指點,您的意思是因為資料型態轉 07/29 11:54
christin023: 換出現精度不一的情況嗎?另外我文中指的轉換,是在 07/29 11:54
christin023: 練習過程中,看到書中寫c#運算資料中若有不同型別的 07/29 11:54
christin023: 資料,會做資料型別的轉換,還是我對這部分有理解錯 07/29 11:54
christin023: 誤呢? 07/29 11:54
ssccg: 你文中只有int轉double(weight * pd時weight自動轉double) 07/29 12:05
ssccg: 沒有double轉int啊 07/29 12:05
ssccg: 然後問題跟轉換沒有關係,你用52.0d * pd也會是一樣結果 07/29 12:20
ssccg: 單純是浮點數的小數部分本來就不是精確數值,你可以想成原 07/29 12:22
ssccg: 本2.20462d就不是2.20462,是2 + 一個很接近0.20462的小數 07/29 12:23
ssccg: 所以最後結果不是114.64024也是很正常的,而且精度非固定會 07/29 12:29
ssccg: 受有幾個數字位數影響 07/29 12:29
ssccg: 如果需要在十進位上精確,用decimal,不需要但是不想沒事冒 07/29 12:32
ssccg: 出一堆9就用Math.Round 07/29 12:34
christin023: 有理解了,非常感謝 07/29 14:05
Sisyphus: 我有遇過一些bug是使用prase decimal需要加上NumberStyl 07/31 04:59
christin023: 我這邊有試過decimal,輸出結果確實是我想要的~ 08/01 22:45