[問題] c# double運算後轉int,輸出值錯誤

看板C_Sharp (C#)作者 (christine)時間3年前 (2021/07/29 01:16), 3年前編輯推噓2(2019)
留言21則, 5人參與, 3年前最新討論串1/1
初學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

07/29 01:54, 3年前 , 1F
不考慮用decimal?
07/29 01:54, 1F

07/29 10:54, 3年前 , 2F
浮點數運算產生的問題,1是像1F講的換數值類型,
07/29 10:54, 2F

07/29 10:54, 3年前 , 3F
2是輸出時指定數值格式。另外你的程式看不出有
07/29 10:54, 3F

07/29 10:54, 3年前 , 4F
轉換int的步驟,標題、內文、程式對不上...
07/29 10:54, 4F

07/29 11:54, 3年前 , 5F
謝謝一樓和二樓前輩指點,您的意思是因為資料型態轉
07/29 11:54, 5F

07/29 11:54, 3年前 , 6F
換出現精度不一的情況嗎?另外我文中指的轉換,是在
07/29 11:54, 6F

07/29 11:54, 3年前 , 7F
練習過程中,看到書中寫c#運算資料中若有不同型別的
07/29 11:54, 7F

07/29 11:54, 3年前 , 8F
資料,會做資料型別的轉換,還是我對這部分有理解錯
07/29 11:54, 8F

07/29 11:54, 3年前 , 9F
誤呢?
07/29 11:54, 9F

07/29 12:05, 3年前 , 10F
你文中只有int轉double(weight * pd時weight自動轉double)
07/29 12:05, 10F

07/29 12:05, 3年前 , 11F
沒有double轉int啊
07/29 12:05, 11F

07/29 12:20, 3年前 , 12F
然後問題跟轉換沒有關係,你用52.0d * pd也會是一樣結果
07/29 12:20, 12F

07/29 12:22, 3年前 , 13F
單純是浮點數的小數部分本來就不是精確數值,你可以想成原
07/29 12:22, 13F

07/29 12:23, 3年前 , 14F
本2.20462d就不是2.20462,是2 + 一個很接近0.20462的小數
07/29 12:23, 14F

07/29 12:29, 3年前 , 15F
所以最後結果不是114.64024也是很正常的,而且精度非固定會
07/29 12:29, 15F

07/29 12:29, 3年前 , 16F
受有幾個數字位數影響
07/29 12:29, 16F

07/29 12:32, 3年前 , 17F
如果需要在十進位上精確,用decimal,不需要但是不想沒事冒
07/29 12:32, 17F

07/29 12:34, 3年前 , 18F
出一堆9就用Math.Round
07/29 12:34, 18F

07/29 14:05, 3年前 , 19F
有理解了,非常感謝
07/29 14:05, 19F

07/31 04:59, 3年前 , 20F
我有遇過一些bug是使用prase decimal需要加上NumberStyl
07/31 04:59, 20F

08/01 22:45, 3年前 , 21F
我這邊有試過decimal,輸出結果確實是我想要的~
08/01 22:45, 21F
文章代碼(AID): #1X0P3ZAY (C_Sharp)
文章代碼(AID): #1X0P3ZAY (C_Sharp)