作者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/cn.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