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

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

Links booklink

Contact Us: admin [ a t ] ucptt.com