今天遇到一个计算细节问题,应该说是数据转换的问题。或者说是C#基础问题。 测试数据是3.4123M, 需要舍弃最后面的3。
decimal temp = 3.4123M;
decimal xxxaaa = ((int)(temp * 1000)) /1000;
Console.WriteLine(xxxaaa);
//输出结果是3,不是我们需要的 3.412
想了很久没有搞明白,于是去问gpt平台,没想到平台一下子解释清楚了。 解释如下
根据您提供的代码: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);