C# 类型转换细节问题

122 阅读1分钟

今天遇到一个计算细节问题,应该说是数据转换的问题。或者说是C#基础问题。 测试数据是3.4123M, 需要舍弃最后面的3。

   decimal temp = 3.4123M;
   decimal xxxaaa = ((int)(temp * 1000)) /1000;
   Console.WriteLine(xxxaaa);

//输出结果是3,不是我们需要的 3.412

1(3%OWH@N(8L`8CI5GYP1ST.png

想了很久没有搞明白,于是去问gpt平台,没想到平台一下子解释清楚了。 解释如下

image.png

根据您提供的代码:decimal xxxaaa = ((int)(temp * 1000)) / 1000;,这段代码会将 temp 的值先乘以 1000,然后将结果转换为整数,再除以 1000。

在这个过程中,由于 (int) 强制类型转换操作符会将结果截断为整数部分,因此小数部分将被丢弃。最后,除以 1000 的操作将得到整数结果。

所以,结果是 3,因为 3.4123 经过计算后只保留了整数部分,丢失了小数部分。

总结一下就是数据((int)(temp * 1000)) 这个过程已经把类型转为int型了,这个时候再除1000就是操作整型,所以后面的数据都舍弃了。

如果分步写,就不会有这个问题

方法一

  decimal testtempX = 3.4123M;
   decimal xin = (int)(testtempX * 1000);
   decimal newXin=xin/1000;
   Console.WriteLine(newXin);

方法二 或者 改成乘以0.001M

 decimal temp = 3.4123M;
   decimal xxxaaa = ((int)(temp * 1000)) *0.001M;
   Console.WriteLine(xxxaaa);

0~M1J8)N5IC{(PDH62B.png